如何获取仅在页面中可见的webElements列表

问题描述 投票:0回答:3

我想获取当前出现在页面上的元素列表,因为某些内容隐藏在我不想访问的页面中。

selenium automation webdriver
3个回答
1
投票

假设您使用的是 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);

0
投票
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", " ")));



 }

0
投票

我推荐几种方法。

  1. 查找仅查找可见所需元素的定位器。当网站有不同版本时,有时会在网站上发生这种情况,例如移动、桌面等

  2. 如果#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");
    
© www.soinside.com 2019 - 2024. All rights reserved.