这是我第一次使用 selenium 和无头浏览器,因为我想使用 ajax 技术抓取一些网页。
效果很好,但在某些情况下加载整个页面需要太多时间(特别是当某些资源不可用时),所以我必须为selenium设置一个超时。
首先我尝试过set_page_load_timeout()
and set_script_timeout()
,但是当我设置这些超时时,如果页面没有完全加载,我将不会获得任何页面源,如下代码:
driver = webdriver.Chrome(chrome_options=options)
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
try:
driver.get(url)
except Exception:
driver.execute_script('window.stop()')
print driver.page_source.encode('utf-8') # raise TimeoutException this line.
所以我尝试使用隐式等待和条件等待,如下所示:
driver = webdriver.Firefox(firefox_options=options, executable_path=path)
print("Firefox Headless Browser Invoked")
wait = WebDriverWait(driver, timeout=10)
driver.implicitly_wait(2)
start = time.time()
driver.get(url)
end = time.time()
print 'time used: %s s' % str(end - start)
try:
WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))
print driver.find_element_by_tag_name('body').text
except Exception:
driver.execute_script('window.stop()')
这次我得到了我想要的内容。但是,它花费了很长的时间(40+秒),这意味着我设置的2秒超时根本不起作用。
在我看来,这似乎是driver.get()
直到浏览器停止加载页面后调用才会结束,只有在这之后下面的代码才可以工作,并且你不能杀死它get()
打电话,否则你什么也得不到。
但这与硒文档有很大不同,我真的想知道错误在哪里。
环境:OSX 10.12、selenium 3.0.9、FireFox 和 Google Chrome Headless(均为最新版本。)
- - 更新 - -
感谢您的帮助。我将代码更改如下,使用WebDriverWait()
单独一个,但是仍然存在调用持续很长时间的情况,远远超过我设置的超时时间。
想知道是否可以在时间到时立即停止页面加载?
driver = webdriver.Firefox(firefox_options=options, executable_path=path)
print("Firefox Headless Browser Invoked")
start = time.time()
driver.get('url')
end = time.time()
print 'time used: %s s' % str(end - start)
try:
WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))
print driver.find_element_by_tag_name('body').text
except Exception:
driver.execute_script('window.stop()')
driver.quit()
这是测试中的终端输出:
Firefox Headless Browser Invoked
time used: 44.6049938202 s
根据代码,这意味着driver.get()
call 需要 44 秒才能完成调用,这是意料之外的,我想知道我是否误解了无头浏览器的行为?