如何使用Selenium重复获取内容<Python>?

How to use Selenium to repeatedly obtain content <Python>?

我正在抓取来自 here 的文本。我需要反复点击 "Load More Arguments" 来获取页面上列出的所有参数。这是我的代码:

try:
    while True:
        link = WebDriverWait(driver, 5).until(
        EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))

        ActionChains(driver).move_to_element(link).perform()
        link.click()
        time.sleep(3) #wait for the update to occurr so the page loads"new arguments for you"
        print(driver.execute_script("return document.documentElement.outerHTML;"))

        if not (link):
            break
finally:
    None

这是错误:

File "debate.py", line 42, in <module>
  EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.44.0-py2.7.egg/selenium/webdriver/support/wait.py", line 71, in until
  raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: 

我确实获得了页面上列出的参数,但我认为我的代码有点奇怪,尤其是在循环中。我想我需要一些东西来代替 "if not",比如 "not clickable"。你能给我一些建议吗?

谢谢。

是的,if not link: 不是您想要的条件。如果这个条件永远为真,那么你的 move_to_elementclick 都不会起作用,因为它们和你的 if not link: 测试之间没有任何东西可以改变 link引用一个元素是 None (或其他一些错误值)。 link 包含的元素引用可能会变成 stale,但此类问题会生成一个特定的异常。没有什么魔法可以将对 None.

的陈旧引用变成

很有可能,您当前 运行 进入的超时事件表明您已完成。我希望加载更多参数的按钮在加载所有内容后不可点击(因为它不再存在或因为它被禁用)。 (我无法验证这一点,因为你提供的 link 让我进入了一个没有说明问题的页面。)

如果中断异常,则可以退出循环。这也处理了尚无参数或没有 足够 个参数来保证按钮存在的情况:

from selenium.common.exceptions import TimeoutException

[....]

while True:
    try:
        link = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
    except TimeoutException:
        break
    [...]

一些注意事项:

  1. 外面的 try... finally 块似乎没有做任何事情。

  2. 通常,您可以在一次操作中移动并单击 link link.click() 应该可以在没有 ActionChains 的情况下工作。在一些相当罕见的情况下,您需要在点击之前执行移动。

  3. 您应该将 time.sleep 调用替换为检查页面状态以确定参数何时完成加载的显式等待。