当前位置: 首页 > 知识库问答 >
问题:

Selenium:如何在不使用隐式Wait的情况下检查页面上是否有元素?

高承望
2023-03-14

我如何检查一个元素是否在页面上没有使用功能隐含等待?我可以检查元素是在页面上使用隐含等待:

    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

    if (driver.findElements(By.cssSelector(MY_CSS_SELECTOR)).size() != 0) {
        //...
    }

有类似的溶液吗?

共有2个答案

郝原
2023-03-14

您已经在使用findElements,请注意findElements不会抛出任何错误,即使传递的定位器在HTMLDOM中不可用。

如果找到,它将返回一个web元素列表。

现在findelelements将尝试轮询DOM,如果它没有立即找到任何,这就是我们使用ImplicitWait的原因。

既然你已经提到你不想处理隐含等待,并且想获取网络元素列表,你要么必须使用显式等待

WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("css_selector_here")));

或者

wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("css_selector_here")));

但请注意,使用显式等待,如果找不到元素,则可能会得到TimeOutException。

明确地说:

对于命令式过程语言,Selenium客户端可以使用显式等待。它们允许您的代码停止程序执行或冻结线程,直到您传递给它的条件得到解决。条件以一定的频率调用,直到等待的超时结束。这意味着只要条件返回错误的值,它就会继续尝试和等待。

由于显式等待允许您等待条件发生,因此它们非常适合在浏览器及其DOM和WebDriver脚本之间同步状态。

隐式等待:

第二种类型的等待不同于显式等待,称为隐式等待。通过隐式等待,当试图找到任何元素时,WebDriver会在一定的时间内轮询DOM。当网页上的某些元素不能立即可用并且需要一些时间加载时,这可能很有用。

默认情况下禁用隐式等待元素出现,并且需要在每个会话的基础上手动启用。混合显式等待和隐式等待会导致意想不到的后果,即即使元素可用或条件为真,等待睡眠的时间也最长。

警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待可能会导致20秒后出现超时。

隐式等待是在试图找到一个或多个元素时,如果它们不是立即可用的,则告诉WebDriver轮询DOM一段时间。默认设置为0,即禁用。一旦设置,就为会话的生命周期设置隐式等待。

官方文件

卢骏俊
2023-03-14

你需要诱导WebDriver等待visibilityOfAllElementsLocatedBy(),你可以使用以下解决方案:

if(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("MY_CSS_SELECTOR"))).size() != 0) {
    //...
}
 类似资料:
  • 问题内容: 我正在尝试编写一个脚本,该脚本需要根据CSS选择器找到的特定浏览器对象是否存在来适应其工作流程行为。 我不想使用document.getElementByID方法,因为从技术上讲,这不是CSS选择器,并且我们整个企业都在CSS选择器上进行了标准化,因此在DOM以外的其他任何选择都不会使CSS选择器超出我们的代码审查过程无论如何。 ThingSelector在哪里: OpenThing在

  • 问题内容: 我想知道an 是否为空,但是没有使用方法。有没有办法知道它是否为空,而无需从中读取? 问题答案: 我想你在找。它不会告诉您它是否为空,但可以指示您是否要读取数据。

  • 问题内容: 这是@Jimt在Go中编写的工作程序和控制器模式的一个很好的示例, ” 但是此代码也有一个问题:如果要在退出时删除工作通道,则会发生死锁。 如果您使用,下次控制器写入该命令将导致恐慌,因为go无法写入一个已关闭的通道。如果您使用某些互斥锁来保护它,则由于它不会从通道读取任何内容,并且将阻止写入,因此互斥锁将导致死锁。您还可以为频道提供更大的缓冲,以解决此问题,但这还不够。 因此,我认为

  • 在我正在测试的页面中,可能会显示两个按钮:BASIC或Advanced。 我想知道高级按钮是否显示--如果显示,请单击它。

  • 问题内容: 有没有办法在不使用机制的情况下判断字符串是否表示整数(例如但不是或)? 问题答案: 如果你真的很讨厌在各处使用s,请编写一个辅助函数: 它将需要更多的代码来完全覆盖Python认为是整数的所有字符串。我说这是pythonic。

  • 问题内容: 有没有一种方法可以确定给定的示例实体类: 所谓“新”,是指有人调用了新的A()甚至可能设置了名称,但从未保存或保留。 通常,人们可以检查id,但是我想要一种不需要id或getId()方法的解决方案。 基本上,即使在分离模式下,此实体也已持久化到数据库中。 @Version或getVersion也不是令人满意的解决方案。 也许是独立的|| isAttached可能有效,但是我不确定如何在