如何等到硒中存在元素?

Posted

技术标签:

【中文标题】如何等到硒中存在元素?【英文标题】:How to wait until an element is present in Selenium? 【发布时间】:2014-01-21 02:21:26 【问题描述】:

我试图让 Selenium 等待页面加载后动态添加到 DOM 的元素。试过这个:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

如果有帮助,这里是fluentWait

FluentWait fluentWait = new FluentWait<>(webDriver) 
    .withTimeout(30, TimeUnit.SECONDS)
    .pollingEvery(200, TimeUnit.MILLISECONDS);

但它会抛出一个NoSuchElementException - 看起来presenceOfElement 期望元素在那里,所以这是有缺陷的。这必须是 Selenium 的面包和黄油,并且不想重新发明***......有人可以提出替代方案,最好不要自己滚动Predicate

【问题讨论】:

【参考方案1】:

您需要调用 ignoring 以忽略异常,而 WebDriver 将等待。

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(200, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);

有关更多信息,请参阅FluentWait 的文档。但请注意,此条件已在 ExpectedConditions 中实现,因此您应该使用

WebElement element = (new WebDriverWait(driver, 10))
   .until(ExpectedConditions.elementToBeClickable(By.id("someid")));

*Update for newer versions of Selenium:

withTimeout(long, TimeUnit) has become withTimeout(Duration)
pollingEvery(long, TimeUnit) has become pollingEvery(Duration)

所以代码看起来是这样的:

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(Duration.ofSeconds(30)
        .pollingEvery(Duration.ofMillis(200)
        .ignoring(NoSuchElementException.class);

等待的基础教程可以在here找到。

【讨论】:

它应该是 或者它应该是 如果你使用的是 java 8 会给你编译错误。 它没有在 ExpectedCondition 中实现....它在 WebDriverWait 中。 public WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut) super(driver, clock, sleeper); this.withTimeout(timeOutInSeconds, TimeUnit.SECONDS); this.pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS); this.ignoring(NotFoundException.class); this.driver = 驱动程序; 【参考方案2】:
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));

您可以在加载整个页面代码执行并抛出错误之前使用此时间。时间是秒

【讨论】:

【参考方案3】:

让我推荐你使用Selenide 库。 它允许编写更简洁和可读的测试。它可以等待语法更短的元素出现:

$("#elementId").shouldBe(visible);

这是一个测试 Google 搜索的示例项目: https://github.com/selenide-examples/google

【讨论】:

不可能将其移植到 python 中? 它已移植到 Python。请参阅“Selene”python 库。【参考方案4】:
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) 

    FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
        .pollingEvery(pollingSec, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);

    for (int i = 0; i < 2; i++) 
        try 
            //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
        fWait.until(ExpectedConditions.visibilityOf(element));
        fWait.until(ExpectedConditions.elementToBeClickable(element));
         catch (Exception e) 

        System.out.println("Element Not found trying again - " + element.toString().substring(70));
        e.printStackTrace();

        
    

    return element;

    

【讨论】:

【参考方案5】:

FluentWait 抛出 NoSuchElementException 是混淆的情况

org.openqa.selenium.NoSuchElementException;     

java.util.NoSuchElementException

.ignoring(NoSuchElementException.class)

【讨论】:

以上是关于如何等到硒中存在元素?的主要内容,如果未能解决你的问题,请参考以下文章

检查元素在硒中是不是可点击

如何滚动到硒中的特定元素?

当元素包含多个类名时如何在硒中复制标签?

如何等到元素存在?

如何等到 Selenium 中不再存在元素

使函数等到元素存在