在等待元素不可见时使用哪个 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
定位器很好,我试图了解等待有什么问题。 有没有人遇到过类似的问题?我很乐意提供任何建议。
答案 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)都使用相同的等待对象,因此它们的执行将“堆叠”:
操作 #2 等待 10 秒。操作 #3 等待 20 秒。
答案 1 :(得分:1)
来自 Waits
的文档 <块引用>警告:不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置隐式等待 10 秒和显式等待 15 秒可能会导致超时发生在 20 秒后。
可能混淆了以下 2 个等待:
导致不可预测等待时间。
在引入 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);