最近在使用selenium框架做网页机器人,记录一些挺重要但是网上没有说的很清晰的细节。
使用find_element_by_xpath()的时候遇到报错,有比较大概率是因为页面有iframe 导致找不到这个节点,因此就需要用 _switch_to.frame()方法来切换到具体的iframe中,再寻找目标节点。
比如豆瓣的登陆验证,就有3个iframe在中间,如图这是第一个iframe
与find_element_by_xpath() 方法不同,_switch_to.frame() 的参数并不支持xpath,
如果使用
driver._switch_to.frame('//*[@id="anony-reg-new"]/div/div[1]/iframe') 是会报错NoSuchFrameException的
_switch_to.frame() 要输入一个对象。
因此,我们切换到第二个iframe,可以采用
iframe = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
driver._switch_to.frame(iframe)
也可以采用 driver._switch_to.frame(1) 的方式。
但是显然,driver._switch_to.frame(iframe) 的方式更加的准确,也容易在网页的xpath 变化后(豆瓣等验证码经常会周期性修改一些参数),更好的修改锁定对象,可阅读性也更强。