Selenium phantomjs与spynner等待网页加载完成方式总结
利用无头浏览器对网页元素进行模拟操作时经常遇到的问题就是**元素不存在这样的错误。原因大概有这么几种。1. 网页没有加载完成,因此定位不到元素2. 网页元素显示样式设置为不可见,即display:none,常见的如一些悬停显示的菜单。3. 元素在iframe 中,常见的情况比如腾讯网站的登录框。一般来讲,在网页源代码中能够看到的且display属性设置为可见的元素,selenium等
·
利用无头浏览器对网页元素进行模拟操作时经常遇到的问题就是**元素不存在
这样的错误。原因大概有这么几种。
- 网页没有加载完成,因此定位不到元素
- 网页元素显示样式设置为不可见,即
display:none
,常见的如一些悬停显示的菜单。 - 元素在
iframe
中,常见的情况比如腾讯网站的登录框。
一般来讲,在网页源代码中能够看到的且display
属性设置为可见的元素,selenium等工具才能够正常定位,要不然就会出现元素不存在的错误。
第2种情况可以使用一些模拟行为触发不可见的元素,或者调用js
、jquery
修改display
属性。
第3种情况selenium可以使用switch_to_frame()
切换iframe
本文重点说下第一种情况,网页只有完全加载,元素才可能被定位,但是网页是否加载完成又该怎么判断、处理呢。
常见处理方法如下:
time.sleep()
直接等待几秒钟,等待网页加载完成,这种方法很死板,网页加载是否加载也不能预测,只能撞大运,但也是最简单的一种方法。- selenium的
driver.implicitly_wait()
,隐式等待,全局性设置,只用设置一次就可以。 - selenium的
WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.WB_FEED'))
,显式等待 - spynner的
br.wait_for_content(lambda br: 'WB_feed' in br.html)
,类似于selenium的显式等待 - spynner的各类操作,如load、click等等操作均内置了等待内容加载的参数,原来的参数如
br.click('div.login-switch', wait_load=True)
,新版的参数形式如br.load("html_controls.html", 1, wait_callback=wait_load)
更多推荐
已为社区贡献4条内容
所有评论(0)