如何解决Selenium Java-如何在Web元素路径中存储变量以遍历多个元素
我一直在尝试使用Selenium java遍历多个Web元素:
/bin/python: No module named virtualenvwrapper
virtualenvwrapper.sh: There was a problem running the initialization hooks.
If Python could not import the module virtualenvwrapper.hook_loader,check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/bin/python and that PATH is
set properly.
但是这些Web元素具有不同的nth-child值,因此我需要像变量一样创建cssselector路径,例如,我正在尝试使用循环中的变量i更改第n个子编号。遍历所有网络元素,就像这样:
for (int i = 0; i < 100; i++) {
driver.findElements(By.cssSelector("#matchListWithMessages > div.messageList > a:nth-child(5)")).click();
}
但是,由于方括号内的代码是String,因此读取i就像是String而不是变量。有什么办法可以使它正确,我的循环会将i读为变量,并逐一遍历所有Web元素?
解决方法
或者您可以使用以下语法:
for (int i = 0; i < 100; i++) {
String selector = String.format("#matchListWithMessages > div.messageList > a:nth-child(%d)",i);
driver.findElement(By.cssSelector(selector)).click();
}
,
严格解决您的问题。您可以使用下面的代码。
for (int i = 0; i < 100; i++) {
String csspath = "#matchListWithMessages > div.messageList > a:nth-child("+i+")";
driver.findElement(By.cssSelector(csspath )).click();
}
还请注意,您的代码中使用的是 driver.findElements 而不是 driver.findElement 。由于前者返回Web元素列表,而click方法不适用于列表类型,但是稍后将返回Web元素类型对象,您将可以单击它。参见以下有关相同内容的更多信息: [https://www.browserstack.com/guide/findelement-in-selenium] [1]
此外,您的技术存在的问题是,如果元素少于100个,则代码将失败;如果元素更多,则代码将仅单击100个。一个更合适的解决方案将是为您的元素提供一个通用的定位器。然后,我们可以使用driver.findElements(By.cssSelector(locator))获取所有此类元素的列表,然后遍历列表以单击所有元素。 这样,您无需担心页面中有多少个此类元素。 [1]:https://www.browserstack.com/guide/findelement-in-selenium
,将其中的所有元素插入到List中,并对其进行循环以获取每个元素。
List<WebElement> list = driver.findElements(By.cssSelector("[class=matchListWithMessages] div a)"));
for(WebElement row : list) {
row.click();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。