一、多表单切换
场景:在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
1)什么是多表单?
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
2)处理方法
直接使用id值切换进表单 driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表单元素,再切换进入 el = driver.find_element_by_xxx(value) driver.switch_to.frame(el) /driver.switch_to_frame(el)
案例:
from selenium import webdriver
# 打开浏览器
drive=webdriver.Firefox()
url="https://qzone.qq.com/"
drive.get(url)
#获取表单元素
bd=drive.find_element_by_id("login_frame")
drive.switch_to.frame(bd)
# 定位元素
dlx=drive.find_element_by_id("switcher_plogin")
dlx.click()
# 获取qq
user=drive.find_element_by_id("u")
user.send_keys("269")
# 获取密码
password=drive.find_element_by_id("p")
password.send_keys("shao")
# 获取登录按钮
dl=drive.find_element_by_id("login_button")
dl.click()
结果:
二、多标签之间的切换
场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
1)获取所有窗口的句柄
handles = driver.window_handlers() 调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。
2)通过窗口的句柄进入的窗口
driver.switch_to_window(handles[n]) driver.switch_to.window(handles[n]) 通过窗口句柄激活进入某一窗口
案例:
from selenium import webdriver
import time
driver=webdriver.Firefox()
url="http://bj.58.com"
driver.get(url)
hands=driver.window_handles
print(hands)
time.sleep(2)
#定位租房
ss=driver.find_element_by_xpath("//*[@id='fcNav']/em/a[1]")
ss.click()
#获取句柄
hands=driver.window_handles
print(hands)
# 切换句柄
driver.switch_to.window(hands[1])
#获取昌平元素
ss=driver.find_element_by_xpath("html/body/div[5]/div[2]/div[2]/dl[1]/dd/a[4]")
ss.click()
#获取昌平周边元素
ss=driver.find_element_by_xpath("html/body/div[5]/div[2]/div[2]/dl[1]/dd/div/a[4]")
ss.click()
部分结果展示:
三、弹出框操作
1) 进入到弹出框中 driver.switch_to.alert
2) 接收警告 accept()
3) 解散警告 dismiss()
4) 发送文本到警告框 send_keys(data)
案例:
from selenium import webdriver
import time
driver=webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
# 获取设置
db=driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[4]/span")
db.click()
# 获取搜索设置
sou=driver.find_element_by_class_name("setpref")
sou.click()
time.sleep(3)
# 定位每页50
ye=driver.find_element_by_id("nr_3")
ye.click()
#定位保存设置
bao=driver.find_element_by_css_selector(".prefpanelgo")
bao.click()
time.sleep(3)
# 弹框
driver.switch_to.alert.accept()
结果: