Python中如何实现selenium的wait until功能

经过查阅文档,wait until 需要调用有 __call__ 方法的值。

我的情况是想检查 <div class='title'> piggy </div> 中的 piggy 是否出现。

读了 文档 之后,并没有发现哪个方法是检查内容的。

这个 title 不是网页的最高级别 title,只是页面中的一个 div,所以 title_istitle_contains 并不适用。

目前使用的办法是:

time_now = time.time()
while(time_now - time.time() < timeout_max):
    title_find = browser.find_element_by_class_name('title')
    if (title_find and title_find.text == 'piggy'):
        break
    else:
        if (time_now - time.time() >= timeout_max):
        	Timeout
do something

求教:肯定有更工整的办法吧?


Python中如何实现selenium的wait until功能

9 回复

在Selenium里,wait until功能主要用WebDriverWait配合expected_conditions来实现。核心就是让WebDriver在抛出TimeoutException之前,等待某个条件成立。

最常用的模式是这样:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("your_url")

try:
    # 等待最多10秒,直到ID为‘element_id’的元素出现
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "element_id"))
    )
    # 找到元素后,你可以对它进行操作,比如点击
    element.click()
except TimeoutException:
    print("元素加载超时")
finally:
    driver.quit()

这里的关键是WebDriverWait(driver, timeout)until(condition)timeout是最长等待时间(秒)。condition来自expected_conditions模块,比如:

  • EC.presence_of_element_located(locator):等待元素出现在DOM里,不一定可见。
  • EC.visibility_of_element_located(locator):等待元素不仅出现,还要可见(有宽高,非隐藏)。
  • EC.element_to_be_clickable(locator):等待元素可点击。
  • EC.text_to_be_present_in_element(locator, text_):等待元素包含特定文本。

locator是一个元组,像(By.ID, "id")(By.CLASS_NAME, "class")(By.XPATH, "xpath")这样。

你也可以用until_not来等条件不成立,或者自己写个函数当条件,函数返回True(表示条件成立)或False/None(表示不成立)。

总结:用WebDriverWaitEC条件实现等待。


谢谢两位,目标网页:[点击这里]( http://www.rdv-etrangers.meurthe-et-moselle.gouv.fr/eAppointment54-etrangers/appointment.do?preselectservice=SEJOUR)
我的代码WebDriverWait(browser, 5).until(EC.presence_of_element_located_value((By.CLASS_NAME, 'title'), 'Introduction'))
然而通过不了,所以我才用的主题里的笨办法……


(EC.text_to_be_present_in_element_value((By.CLASS_NAME, ‘title’), ‘Introduction’))
这个可以哈哈哈,我写错方法了……

现在在研究怎么替换这一句:

if (browser.find_element_by_xpath(’//*[title=“suivant”]’)):

用 By.XPATH, 并把 XPath 写为:

//div[@class=“title” and contains(text(), “piggy”)]


谢谢~~ 这个搞定了~
目前正在替换怎么检测是否存在某个 checkbox

原代码:if (browser.find_element_by_xpath("//input[value=‘75’]")):, 网页第二页

requests 是发 http 请求用的呀,压根不可能知道网页长什么样有什么东西啊。

回到顶部