如何在selenium超时无限加载页面后获取新页面

时间:2018-04-25 21:01:28

标签: python selenium selenium-webdriver webdriver selenium-chromedriver

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

如何“重置”驱动程序以便我可以继续使用它?或者失败了,如何在访问有问题的页面后调试.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

1 个答案:

答案 0 :(得分:2)

根据您的问题和您自己的代码块,我已经执行了您自己的代码,通过 chrome.options 类调整了几个 ChromeDriver 设置,如下所示 > perfecto

代码块:

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!

您的问题和解决方案

您需要考虑以下几点:

  • 除非您的 usecase 页面加载超时有约束,否则您不得在慢速网络上使用set_page_load_timeout(),同时调用网址,例如{em>浏览器客户端 http://coastalpathogens.wordpress.com/2012/11/25/onezoom/可能需要更多 10秒(即配置的set_page_load_timeout(10)时间)才能将document.readyState equal to "complete"发送到
  • 如果 usecase 依赖于页面加载超时,请捕获异常并调用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()的详细讨论
  • 考虑用ExplicitWait替换implicitly_wait()的使用情况。现代网站使用 JavaScript Ajax Calls React Native ,其中 WebDriverWait 将会发挥作用,您可以使用。将implicitly_wait()WebDriverWait()混合起来。