我想获取当前出现在页面上的元素列表,因为某些内容隐藏在我不想访问的页面中。
假设您使用的是 Java,您可以使用 ExpectedConditions 并执行类似的操作,
WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 300/*timeOutInSeconds*/);
ExpectedCondition<List<WebElement>> condition = ExpectedConditions.visibilityOfAllElementsLocatedBy(By.id("foo"))
List<WebElement> allVisibleElements = wait.until(condition);
public static void logVisible(WebDriver driver, String couldNotFind) {
logger.error("Could not find element "+couldNotFind+", but here is what was actually on the page");
driver.findElements(By.xpath("//*[self::div or self::input or self::li or self::ul or self::button]")).stream()
.filter(s -> s.isDisplayed())
.forEach(s -> logger.error(String.format("Visible : Id:%s Tag:%s Class:%s Text:%s",
s.getAttribute("id"), s.getTagName(), s.getAttribute("class"), s.getText()).replaceAll(" ", " ").replaceAll("\n", " ")));
}
我推荐几种方法。
查找仅查找可见所需元素的定位器。当网站有不同版本时,有时会在网站上发生这种情况,例如移动、桌面等
如果#1 不起作用,我们可以创建一个方法,该方法采用定位器,查找所有元素,然后将列表过滤为仅那些可见的元素。
public List<WebElement> findVisibleElements(By locator) {
return driver.findElements(locator).stream().filter(e -> e.isDisplayed()).collect(Collectors.toList());
}
然后你会像这样使用它
List<WebElement> inputs = SeleniumSandbox.findVisibleElements(By.id("someId"));
// this is for debugging purposes and should be the count of matching visible elements
System.out.println(inputs.size());
// this sends "some text" to the first visible element
inputs.get(0).sendKeys("some text");