2

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

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

4

2 回答 2

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. 等待对象将等待 10 秒的条件
  2. 等待 10 秒(继承) + 微调器出现
  3. 等待 10 秒(继承) + 微调器出现(继承) + 微调器消失

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

于 2020-12-19T22:27:21.953 回答
1

来自Waits的文档

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

可能是以下两种等待的混合:

  • 全局隐式等待为 20 秒
  • WebDriverWait(驱动程序,10)

导致不可预测的等待时间。


解决方案

在诱导WebDriverWait时,您需要重新配置隐式等待0使用以下代码行:

  • 蟒蛇

    driver.implicitly_wait(0)
    
  • 爪哇

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

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    
于 2020-12-19T21:04:50.933 回答