gpt4 book ai didi

java - 检索和访问 Selenium 中的相同元素

转载 作者:行者123 更新时间:2023-12-01 09:38:31 25 4
gpt4 key购买 nike

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

slider to automate

在 HTML 代码中,两个点都由

表示

html code of the two elements

样式属性 left: 会根据 slider 上点的位置而相应变化。

现在我面临的问题:

我无法同时按住这两个 slider 元素。我尝试过:

  • PageFactory 与 @FindAll,CSS 选择器和 xpath:

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

  • 获取父元素并迭代子元素以到达 slider 点
  • 上述的一些其他组合

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

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 列表时也会发生同样的情况:我似乎总是只得到左侧 slider (= DOM 中的第一个 slider ?)。

我唯一一次能够操作右侧 slider 是当我只访问它时,即没有尝试触摸另一个 slider 时:

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

(...)

resetSlider(ageSliders.get(1))

但是例如做

resetSlider(ageSliders.get(1))
resetSlider(ageSliders.get(0))

在上面的示例中,再次仅移动左侧 slider ...非常困惑o_O

如果您能提供任何提示或经验,我将不胜感激,这将帮助我解决此问题。

最佳答案

我尝试使用以下 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;

您用来移动 slider 的代码是什么(例如 resetSlider 方法的主体)?我的猜测是该方法存在问题,或者页面上存在与 //slider/span 匹配的其他元素可能正在被检索。您可以通过简单地打印列表的大小来检查(例如 System.out.println(page.getPointers.size()); )。另一种可能性是页面一侧的 slider 是否经过验证(例如,您不能将右侧 slider 移动到左侧 slider 的左侧和/或它们必须保持一定距离等)。

注意:顺便说一句,您上面发布的输出没有显示相同的 id ...这种 toString:

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

只是 Web 元素 toString。这个用破折号分隔的长字符串不是元素的 ID,而是 Web 驱动程序的 ID。另请注意,您不需要使用 @FindAll...获取元素列表。这是针对不同的语义情况。是否获得带有 @FindBy 的元素列表页面对象中的内容仅由其注释的字段是否声明为 WebElement 类型来确定或List<WebElement> .

关于java - 检索和访问 Selenium 中的相同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38635438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com