Selenium显式等待在Python中不起作用

时间:2018-10-18 18:22:00

标签: python selenium

我正在尝试在网站上自动导航我的帐户。因为Selenium不会在会话之间存储我的cookie,所以我每次都必须通过弹出窗口接受服务条款。可以,除非Selenium无法等待。

# wait 1 minute
wait = WebDriverWait(driver, 60)

# wait for TOS to appear
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="tos_agree"]')))

# accept TOS
elem = driver.find_element_by_xpath('//*[@id="tos_agree"]')
elem.click()
elem = driver.find_element_by_xpath('//*[@id="accept_tos"]')
elem.click()

# wait for login window to appear (b/c TOS needs to fade)
wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="login-dropdown"]')))

# login
elem = driver.find_element_by_xpath('//*[@id="login-dropdown"]')
elem.click()

第一次等待似乎有效,但随后我收到此消息。

Message: Element <a id="login-dropdown" class="dropdown-toggle" href="/login"> is not clickable at point (1228.0749740600586,18.5) because another element <h2 class="heading"> obscures it

堆栈跟踪指示错误是由最后一个elem.click()引起的。我还可以确认我的程序没有在崩溃前等待一整分钟。

这是怎么回事,我该如何解决?

1 个答案:

答案 0 :(得分:0)

# wait for login window to appear (b/c TOS needs to fade)
wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="login-dropdown"]')))

上面的行不会在所有情况下都等待TOS消失。如果他们使用css过渡淡入淡出,则在过渡完成之前,您将看到登录下拉列表。

只需添加一个不可见性等待fpr TOS并尝试。所以你可以这样写,

 # wait for TOS to fade)
wait.until(EC.invisibility_of_element_located((By.XPATH, '//*[@id="accept_tos"]')))
# wait for login window to appear
wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="login-dropdown"]')))