我正在从这里爬行文本。我需要反复单击“加载更多参数”以获取页面上列出的所有参数。这是我的代码:
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 link:
是不是你想要的状态。如果这个条件曾经是真的,那么您move_to_element
和theclick
都不会起作用,因为在它们与您的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
调用替换为显式等待,该等待将检查页面状态以确定参数何时完成加载。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句