无法让我的脚本有条件地等待

时间:2019-02-09 12:41:31

标签: python python-3.x selenium selenium-webdriver web-scraping

我试图用python与硒结合编写脚本,以等待某个元素可用。我希望脚本等待的内容是受验证码保护的。我不想设定固定时间。因此,我需要它等到我解决自己。

我尝试过:

import time
from selenium import webdriver

URL = "https://www.someurl.com/"

driver = webdriver.Chrome()
driver.get(URL)
while not driver.find_element_by_css_selector(".listing-content"):
    time.sleep(1)

print(driver.current_url)
driver.quit()

但是,脚本会引发错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:

无论如何花费多长时间,如何使脚本等待元素可用?

3 个答案:

答案 0 :(得分:3)

如果您不想硬编码等待时间,则可以将ExplicitWait与float("inf")一起使用,在Python中,from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait as wait from selenium.webdriver.support import expected_conditions as EC wait(driver, float("inf")).until(EC.presence_of_element_located((By.CLASS_NAME, "listing-content"))) 代表 INFINITY

then:

答案 1 :(得分:1)

您应该使用WebDriverWait:

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

element = WebDriverWait(driver, 10000).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".listing-content")))

它不会无限期等待,但是您可以将超时设置为高。否则,您可以尝试在循环中使用WebDriverWait语句。

答案 2 :(得分:1)

在您询问如何组织try / except块时,这是一个主意。我建议坚持使用inf-wait方法。

while True:
    try:
        driver.find_element_by_css_selector(".listing-content")
        break
    except:
        time.sleep(0.1)

我将包含time.sleep()语句以最大程度地减少函数调用的次数。