我正在使用ChromeDriver使用Python进行一些web抓取。我的代码使用browser.find_element_by_xpath
,但我必须在点击/输入之间包含time.sleep(3)
,因为我需要等待网页加载才能执行下一行代码。
想知道是否有人知道最好的方法?也许有一个功能可以在浏览器加载时立即自动执行下一行,而不是等待任意的秒数?
谢谢!
使用expected_conditions
尝试explicit wait
,如下所示。
进口需求:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
然后,您可以等待元素出现,然后再进行交互。
# waiting for max of 30 seconds, if element present before that it will go on to the next line.
ele = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"xpath_goes_here")))
ele.click() # or what ever the operation like .send_keys()
这样,应用程序将动态地等待,直到元素出现为止。如果需要,根据您的应用程序将时间从30秒更新。
此外,在检查元素存在时,您可以使用不同的定位策略,例如:By.CSS_SELECTOR/By.ID/By.CLASS_NAME
我已经为这种情况使用了一个函数,该函数为脚本添加了健壮性。例如,通过xpath查找元素:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions as EC
def findXpath(xpath,driver):
actionDone = False
count = 0
while not actionDone:
if count == 3:
raise Exception("Cannot found element %s after retrying 3 times.n"%xpath)
break
try:
element = WebDriverWait(driver, waitTime).until(
EC.presence_of_element_located((By.XPATH, xpath)))
actionDone = True
except:
count += 1
sleep(random.randint(1,5)*0.1)
return element
让我知道这对你有用!