我正在将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驱动程序上。
答案 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));