我试图用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:
无论如何花费多长时间,如何使脚本等待元素可用?
答案 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()语句以最大程度地减少函数调用的次数。