为什么Selenium 的wait.until_not(EC.invisibility_of_element_located) 不会等待加载器消失太久?

时间:2020-12-19 19:08:25

标签: python selenium selenium-webdriver webdriverwait implicitwait

在等待元素不可见时使用哪个 selenium.webdriver.support.expected_conditions 更好? 就我而言,我将数据输入到表单中,单击保存并等待加载程序消失

from selenium.webdriver.support import expected_conditions as EC 
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")

在输出中,我看到第二个等待执行了 20 秒(我的全局隐式等待是 20 秒)

360ms ⟥     [debug] loader appeared
21s 141ms ⟥ [debug] loader disappeared

定位器很好,我试图了解等待有什么问题。 有没有人遇到过类似的问题?我很乐意提供任何建议。

2 个答案:

答案 0 :(得分:2)

您的等待操作相互叠加,因为您的代码是链接在一起的。

让我用你的代码解释一下:

# 1. create a wait object
wait = WebDriverWait(driver, 10)

# 2. execute a wait statement
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")

# 3. execute a wait statement
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")

两个等待语句(#2 和 #3)都使用相同的等待对象,因此它们的执行将“堆叠”

  1. Wait 对象将等待 10 秒的条件
  2. 等待 10 秒 (继承) + 微调器出现
  3. 等待 10 秒 (继承) + 微调出现 (继承) + 微调消失

操作 #2 等待 10 秒。操作 #3 等待 20 秒。

答案 1 :(得分:1)

来自 Waits

的文档 <块引用>

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

可能混淆了以下 2 个等待:

  • 全局隐式等待时间为 20 秒
  • WebDriverWait(driver, 10)

导致不可预测等待时间。


解决方案

在引入 WebDriverWait 时,您需要使用以下代码行将 implicit wait 重新配置为 0

  • Python

    driver.implicitly_wait(0)
    
  • Java

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
    
  • DotNet

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    
相关问题