我正在抓取here的文字。我需要反复单击“加载更多参数”以获取页面上列出的所有参数。这是我的代码:
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:
我确实获得了页面上列出的参数,但我认为我的代码有点奇怪,特别是在循环中。我想我需要一些东西来代替“如果没有”,就像“不可点击”一样。你能给我一些建议吗?
谢谢。
答案 0 :(得分:2)
是的,if not link:
不是您想要的条件。如果这种情况确实如此,那么move_to_element
和click
都不会起作用,因为它们和您的if not link:
测试之间没有任何内容可以改变link
引用元素为None
(或其他一些错误值)。 link
包含的元素引用可能会变为陈旧,但此类问题会生成特定异常。没有任何魔法可以将陈旧的引用变为None
。
很可能,您当前遇到的超时事件表明您已完成。一旦你加载了所有东西,我希望加载更多参数的按钮是不可点击的(因为它不再存在或因为它被禁用)。 (我无法验证这一点,因为您提供的链接会将我带到一个不能说明问题的页面。)
如果您中断异常,则可以退出循环。这也解决了没有参数的情况,或者没有足够的参数来保证按钮的存在:
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
[...]
一些注意事项:
外部try... finally
块似乎没有做任何事情。
通常情况下,您可以在一次操作中移动并点击链接,link.click()
应该在没有ActionChains
的情况下运行。在一些非常罕见的情况下,您需要在点击之前执行移动。
您应该使用明确的等待替换您的time.sleep
调用,该等待检查页面的状态以确定参数何时完成加载。