Selenium多表单切换switch_to.frame
捋了捋还有那些需要自动打卡的站点,
结果发现52pojie的qq自动登录,
只用find_element的话找不到代码,
原因是 frame 嵌套页面的应用,
WebDriver 每次只能在一个页面上识别元素。
这个时候就需要通过 switch_to.frame(),
将当前定位的主体切换到 frame 里在定位元素。
- switch_to.frame() 默认可以直接取表单的 id 或 name 属性进行切换。
#id = "if"
wd.switch_to.frame("if")
#name = "nf"
wd.switch_to.frame("nf")
- 那么如果 iframe 没有可用的 id 和 name 可以先定位frame
#先通过 xpth 定位到 iframe
xf = wd.find_element_by_xpath('//*[@class="if"]')
#再将定位对象传给 switch_to_frame()方法
wd.switch_to_frame(xf)
wd.switch_to_default_content()
- 完成了当前表单的操作可通过switch_to.default_content()返回到上一层表单
QQ自动登录实现
def pojie():
wd.get('https://www.52pojie.cn/index.php')
# 跳转qq登录界面
wd.find_element(By.XPATH,'//div[@class="fastlg_fm y"]/p/a').click()
wd.implicitly_wait(5)
# 切换到frame
wd.switch_to.frame('ptlogin_iframe')
# 定位快捷登录账号
wd.find_element(By.XPATH,'//div[@id="qlogin_list"]/a').click()
sleep(5)
wd.find_element(By.XPATH,'//div[@id="um"]//p[2]/img').click()
# wd.implicitly_wait(10)
print('hifini.com签到完成')
pojie()