在Selenium中重新获取和访问相同的元素

时间:2016-07-28 11:46:35

标签: java selenium

我正在使用Java中的Selenium自动测试WebApp。其中一个测试用例必须使用带有2个点的滑块(用于选择年龄范围)

slider to automate

在HTML代码中,两个点都由

表示

html code of the two elements

样式属性left:会相应地更改滑块上点的位置。

现在我面临的问题是:

我无法同时抓住这两个滑块元素。我试过了:

  • 带有@FindAll的PageFactory,包括css选择器和xpath:

    @FindAll({
      @FindBy(xpath = "//slider/span")
    })
    private List<WebElement> ageSliders;
    
  • 带有css和xpath选择器的
  • driver.findBy(...) - 在方法中全局和本地,以防万一PageFactory元素初始化有任何问题

  • 获取父元素并迭代子元素以获得滑块点
  • 上述
  • 的其他一些组合

无论我做什么,只检索一次元素两次。例如:

System.out.println(driver.findElement(By.xpath("//slider/span[@class='pointer'][1]")))
System.out.println(driver.findElement(By.xpath("//slider/span[@class='pointer'][2]")))

打印出两个具有相同ID的元素:

[[FirefoxDriver: firefox on MAC (ee9fc3d7-77fb-3042-9002-5316c1d94e89)] -> xpath: //slider/span[@class='pointer'][1]]
[[FirefoxDriver: firefox on MAC (ee9fc3d7-77fb-3042-9002-5316c1d94e89)] -> xpath: //slider/span[@class='pointer'][2]]

这使得分别无法访问它们。滑动两个元素只会移动左边的元素。

从上面迭代ageSliders列表时也是如此:我似乎总是只得到左滑块(= DOM中的第一个滑块?)。

我唯一一次能够操作正确的滑块,当我只访问它时,即没有尝试触摸另一个:

@FindAll({
  @FindBy(xpath = "//slider/span")
})
private List<WebElement> ageSliders;

(...)

resetSlider(ageSliders.get(1))

然而,例如

resetSlider(ageSliders.get(1))
resetSlider(ageSliders.get(0))
在上面的示例中,

再次移动左滑块...非常混乱o_O

我会很感激任何提示或经验,这将有助于我解决这个问题。

1 个答案:

答案 0 :(得分:1)

我尝试使用以下HTML进行实验:

<html>
    <body>
        <slider>
            <span class="pointer" style="left: 58.878px"></span>
            <span class="pointer" style="left: 187.024px"></span>
        </slider>
    </body>
</html>

然后我运行了以下简单的测试代码:

public class FooTest {

    @Test
    public void foo() {
        WebDriver driver = new FirefoxDriver();
        FooPage page = new FooPage();
        PageFactory.initElements(driver, page);
        driver.get("file:///Users/aarondavis/Desktop/index.html");
        for (WebElement elem : page.getPointers()) {
            System.out.println(elem);
            System.out.println(elem.getAttribute("style"));
        }
        driver.quit();
    }

    public static final class FooPage {
        @FindBy(xpath = "//slider/span")
        private List<WebElement> pointers;

        public List<WebElement> getPointers() {
            return pointers;
        }
    }
}

输出显示迭代的两个元素:

[[FirefoxDriver: firefox on MAC (fdbc9c63-a173-d44b-97be-c328210ce0bf)] -> xpath: //slider/span]
left: 58.878px;
[[FirefoxDriver: firefox on MAC (fdbc9c63-a173-d44b-97be-c328210ce0bf)] -> xpath: //slider/span]
left: 187.024px;

用于移动滑块的代码是什么(例如resetSlider方法的主体)?我的猜测是该方法存在问题,或者页面上有其他可能正在检索的//slider/span元素。您只需打印列表大小即可检查(例如System.out.println(page.getPointers.size());)。另一种可能性是如果页面上有滑块的验证(例如,你不能将右边的滑块移动到左边的那个和/或它们必须是一定的距离等)。

注意:BTW你上面发布的输出没有显示相同的id ...这种toString:

[[FirefoxDriver: firefox on MAC (fdbc9c63-a173-d44b-97be-c328210ce0bf)] -> xpath: //slider/span]

只是web元素toString。那个长字符串分隔的字符串不是元素的id,而是web驱动程序的id。另请注意,您无需使用@FindAll...来获取元素列表。这是针对不同的语义案例。是否在页面对象中获得带有@FindBy的元素列表,只需将其注释的字段声明为WebElementList<WebElement>的类型即可。 / p>