我正在使用Java中的Selenium自动测试WebApp。其中一个测试用例必须使用带有2个点的滑块(用于选择年龄范围)
在HTML代码中,两个点都由
表示样式属性left:
会相应地更改滑块上点的位置。
现在我面临的问题是:
我无法同时抓住这两个滑块元素。我试过了:
带有@FindAll
的PageFactory,包括css选择器和xpath:
@FindAll({
@FindBy(xpath = "//slider/span")
})
private List<WebElement> ageSliders;
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
我会很感激任何提示或经验,这将有助于我解决这个问题。
答案 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
的元素列表,只需将其注释的字段声明为WebElement
或List<WebElement>
的类型即可。 / p>