Selenium phantomjs与spynner等待网页加载完成方式总结

利用无头浏览器对网页元素进行模拟操作时经常遇到的问题就是**元素不存在这样的错误。原因大概有这么几种。
1. 网页没有加载完成,因此定位不到元素
2. 网页元素显示样式设置为不可见,即display:none,常见的如一些悬停显示的菜单。
3. 元素在iframe 中,常见的情况比如腾讯网站的登录框。
一般来讲,在网页源代码中能够看到的且display属性设置为可见的元素,selenium等工具才能够正常定位,要不然就会出现元素不存在的错误。

第2种情况可以使用一些模拟行为触发不可见的元素,或者调用jsjquery修改display属性。
第3种情况selenium可以使用switch_to_frame()切换iframe

本文重点说下第一种情况,网页只有完全加载,元素才可能被定位,但是网页是否加载完成又该怎么判断、处理呢。
常见处理方法如下:
1. time.sleep()直接等待几秒钟,等待网页加载完成,这种方法很死板,网页加载是否加载也不能预测,只能撞大运,但也是最简单的一种方法。
2. selenium的driver.implicitly_wait(),隐式等待,全局性设置,只用设置一次就可以。
3. selenium的WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.WB_FEED')),显式等待
4. spynner的br.wait_for_content(lambda br: 'WB_feed' in br.html),类似于selenium的显式等待
5. spynner的各类操作,如load、click等等操作均内置了等待内容加载的参数,原来的参数如br.click('div.login-switch', wait_load=True),新版的参数形式如br.load("html_controls.html", 1, wait_callback=wait_load)

你可能感兴趣的:(Selenium)