gpt4 book ai didi

python - 如何在无限加载页面上 Selenium 超时后获取新页面

转载 作者:行者123 更新时间:2023-12-01 09:30:15 25 4
gpt4 key购买 nike

我遇到了一个有问题的页面,导致 MacOSX 上的 Selenium Chrome(python 3 中的 selenium 版本 3.10.0,chromedriver 版本 2.35.528157)超时,我认为是因为页面上有一些无限期加载的内容。问题是,在该超时之后,所有 future 对驱动程序 .get() 新 url 的请求也会因超时而失败,即使它们之前有效。事实上,观察浏览器它永远不会发送到新的 url。当然,这会使浏览器无法进行进一步的 session 。

如何“重置”驱动程序以便我可以继续使用它?或者如果失败,我如何调试为什么 .get() 命令在访问有问题的页面后似乎不起作用。代码和我的输出如下(有问题的页面是http://coastalpathogens.wordpress.com/2012/11/25/onezoom/:如果其他人看到同样的事情,我会很感兴趣,以及其他页面

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

browser = webdriver.Chrome()
browser.set_page_load_timeout(10)
browser.implicitly_wait(1)

for link in ("http://www.google.com", "http://coastalpathogens.wordpress.com/2012/11/25/onezoom/","http://www.google.com"):
try:
print("getting {}".format(link))
browser.get(link)
print("done!")
except TimeoutException:
print("Timed out")
continue

结果:

getting http://www.google.com
done!
getting http://coastalpathogens.wordpress.com/2012/11/25/onezoom/
Timed out
getting http://www.google.com
Timed out

最佳答案

根据您的问题和您自己的代码块,我已经执行了您自己的代码,通过 chrome.options 类调整了一些 ChromeDriver 设置,如下所示,它可以工作 完美:

代码块:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException

options = Options()

options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
browser = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
browser.set_page_load_timeout(10)

for link in ("http://www.google.com", "http://coastalpathogens.wordpress.com/2012/11/25/onezoom/","http://www.google.com"):
try:
print("getting {}".format(link))
browser.get(link)
print("done!")
except TimeoutException:
print("Timed out")
continue

控制台输出:

getting http://www.google.com
done!
getting http://coastalpathogens.wordpress.com/2012/11/25/onezoom/
done!
getting http://www.google.com
done!

您这边的问题及解决方案

您需要考虑以下几件事:

  • 除非您的用例对页面加载超时有限制,否则您在调用时不得像在慢速网络上那样使用set_page_load_timeout()网址例如http://coastalpathogens.wordpress.com/2012/11/25/onezoom/浏览器客户端可能需要超过10秒(即通过 set_page_load_timeout(10) 配置的时间,将 document.readyState 等于“complete” 发送到 Selenium
  • 如果您的用例依赖于页面加载超时,请捕获异常并调用quit()以正常关闭,如下所示如下:

    from selenium import webdriver

    driver = webdriver.Chrome(executable_path=r'C:\path\to\chromedriver.exe')
    driver.set_page_load_timeout(2)
    try :
    driver.get("https://www.booking.com/hotel/in/the-taj-mahal-palace-tower.html?label=gen173nr-1FCAEoggJCAlhYSDNiBW5vcmVmaGyIAQGYATG4AQbIAQzYAQHoAQH4AQKSAgF5qAID;sid=338ad58d8e83c71e6aa78c67a2996616;dest_id=-2092174;dest_type=city;dist=0;group_adults=2;hip_dst=1;hpos=1;room1=A%2CA;sb_price_type=total;srfid=ccd41231d2f37b82d695970f081412152a59586aX1;srpvid=c71751e539ea01ce;type=total;ucfs=1&#hotelTmpl")
    print("URL successfully Accessed")
    driver.quit()
    except :
    print("Page load Timeout Occured. Quiting !!!")
    driver.quit()
  • 控制台输出:

    Page load Timeout Occured. Quiting !!!

    您可以在How to set the timeout of 'driver.get' for python selenium 3.8.0?中找到关于set_page_load_timeout()的详细讨论。

  • 考虑将 implicitly_wait() 的用法替换为 ExplicitWait 。现代网站使用 JavaScriptAjax 调用React Native,其中 WebDriverWait 将发挥作用,并且您不能混合使用将 implicitly_wait()WebDriverWait() 一起使用。

关于python - 如何在无限加载页面上 Selenium 超时后获取新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com