Selenium,当Internet速度较慢时,Firefox geckodriver不会等待页面完全加载

时间:2018-10-26 04:03:03

标签: selenium firefox geckodriver

我正在将selenium与Firefox驱动程序(geckodriver)结合使用,以从URL列表中获取一些页面源。

我注意到,如果Internet速度很慢,FireFox不会等待页面完全加载(执行不会在第5行等待)。结果,第9行中的page_source实际上来自先前的URL。

如何使Firefox等待页面完全加载?

硒:3.14.1
Geckodriver:0.23.0 linux64

1        browser = webdriver.Firefox()
2    
3        for url in url_list:
4          
5            browser.get(url)
6    
7            sleep(1)
8    
9            page_source = browser.page_source
10    
11           if  html == page_source:
12    
13                print "error: page not fully loaded"
14    
15                exit(1)
16           html = page_source

更新:我已经测试过Chrome驱动程序。 Chrome驱动程序会等到页面完全加载后才开始。因此,问题可能出在FireFox驱动程序上。

3 个答案:

答案 0 :(得分:1)

通常,Selenium Webdriver中的“ .get”是使用HTTP GET操作完成的,该方法将阻塞直到加载完成。因此,我认为互联网连接速度不慢会导致此问题,但是如果您中断了互联网连接,就有可能发生该问题。

如果页面相同,则可以利用Explicit Wait等待页面上的任何元素,如果该元素不可见或未加载,则可以再次单击“ .get”方法或执行“ .refresh” ()“方法。

显然,如果页面不同,则使用显式等待来等待body标签[xpath:“ // body”]的加载。

有关显式等待refer here

的更多详细信息

答案 1 :(得分:1)

您必须检查浏览器中已加载页面的就绪状态是否已完成,直到可以等待驱动程序使用,t才会引发错误,因此应将其放入try catch块中。

driver.get(url)
WebDriverWait(driver, 30).until(readystate_complete)

有不同的就绪状态,例如
正在加载,完整且交互式
通常在javascript中,人们会document.readystate
完整意味着文档已被完全读取并且所有资源(如图像)也已加载

答案 2 :(得分:0)

您可以等待使用WebDriverWait,直到找到特定元素或网络速度变慢为止,还可以添加隐式等待,然后获取页面源代码

请在下面找到Java代码:

WebDriverWait wait = new WebDriverWait(driver, 20);

wait.until(ExpectedConditions.stalenessOf(element));