我正在抓取一个动态页面,要求用户多次单击“加载更多结果”按钮以获取所有数据。有没有更好的方法来处理显示时单击元素的任务?
def clickon(xpath):
try:
element = driver.find_element_by_xpath(xpath)
except:
print "RETRYING CLICKON() for %s" % (xpath)
time.sleep(1)
clickon(xpath)
else:
element.click()
time.sleep(3)
def click_element_while_displayed(xpath):
element = driver.find_element_by_xpath(xpath)
try:
while element.is_displayed():
clickon(xpath)
except:
pass
答案 0 :(得分:3)
我怀疑你问这个问题,因为目前的解决方案很慢。这主要是因为你有这些硬编码的time.sleep()
延迟,等待的时间比通常要多。为了解决这个问题,我开始使用Explicit Waits - 初始化无限循环并在selenium停止等待按钮可点击时将其中断:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
wait = WebDriverWait(driver, 10)
while True:
try:
element = wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
element.click()
except TimeoutException:
break # cannot click the button anymore
# TODO: wait for the results of the click action
现在最后一个TODO
部分也很重要 - 在这里我建议你等待一个特定的条件,表明点击会导致页面上的内容 - 例如,加载了更多的结果。例如,您可以使用类似于this one的自定义预期条件。