显示时,Python selenium单击元素

时间:2016-10-07 16:45:29

标签: python selenium selenium-webdriver

我正在抓取一个动态页面,要求用户多次单击“加载更多结果”按钮以获取所有数据。有没有更好的方法来处理显示时单击元素的任务?

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

1 个答案:

答案 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的自定义预期条件。