selenium中的元素操作之三大切换(二)
一、窗口切换
使用方法:
1、获取到打开的所有的窗口,句柄handles
all_handles = driver.window_handles
print(all_handles)
2、获取当前的窗口
driver.current_window_handle
print(driver.current_window_handle)
3、利用切换的语句,切换到想要操作的窗口(HTML页面)
# 获取到的所有窗口为一个列表,用索引取值
driver.switch_to.window(all_handles[-1])
举例说明:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com") wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
time.sleep(2) # 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1]) # 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2) # 关闭浏览器
driver.quit()
上述的方法在新窗口出现之后,需要有一个强制的等待页面加载的时间time.sleep(2),这样是为了保证在页面未加载出来去点击,导致程序报错。我们采用的是强制等待的方式;那么在这里有一个小小的骚操作,在expected_conditions文件中,有一个new_window_is_opened类,等待新窗口的出现;该类调用时要传入一个current_handles的参数,功能为:所有的窗口句柄>current_handles,结果为True,条件成立。这个骚操作主要是为了替代强制等待这种方法,当然两种方法都可以用。
骚操作举例说明:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问百度首页
driver.get("http://baidu.com") wait = WebDriverWait(driver, 20)
# 定位输入框,并输入“腾讯课堂”进行搜索
driver.find_element_by_id('kw').send_keys("腾讯课堂")
# 点击搜索按钮
driver.find_element_by_id('su').click()
# 满足以下条件,才会进行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc)) # 在新的窗口出现之前,获取窗口列表,这时窗口数为1
cur_handles = driver.window_handles
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click() # 出现了新的HTML页面
# 出现新的窗口之后,窗口数为2,2>1,条件为True
wait.until(EC.new_window_is_opened(cur_handles))
# 再次获取所有的窗口
# 获取所有的窗口,句柄
all_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(all_handles[-1]) # 在新的页面中找元素,并操作。
# 找到登录的元素,并点击登录的按钮
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2) # 关闭浏览器
driver.quit()
二、iframe切换
切换的条件:如果你要操作的元素,在iframe当中, 你才需要切换
页面元素(容器)-里面是一个HTML页面
iframe定位方式 driver.switch_to.frame()
index,下标
driver.switch_to.frame(3)
name属性
driver.switch_to.frame("name属性的值")
webelement对象
driver.switch_to.frame(driver.find_element_by_xpath('xpath表达式'))
支持selenium中8中定位方法
嵌套的iframe
driver.switch_to.frame()
直接返回main页面
driver.switch_to.default_content()
切换到父级iframe
driver.switch_to.parent_frame()
举例说明:以登录腾讯课堂为例
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 实例化webdriver中的Chome对象
driver = webdriver.Chrome()
# 访问腾讯课堂
driver.get('https://ke.qq.com/') # 查找登录按钮,设置等待条件
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登录"]')
# 找到找到登录的元素在进行下一步操作,查找时间上限为10秒
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 找到元素,并点击
driver.find_element(*loc).click()
time.sleep(3) # 点击QQ登录,等待元素被找到进行下一步
loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
time.sleep(1)
# iframe切换方式一:通过下标、name属性、webelement对象进行切换
# 弹出一个iframe登录框,定位iframe框
driver.switch_to.frame('login_frame_qq')
# 使用显性等待
loc = (By.ID, 'switcher_plogin')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 查找用账号密码登录元素
driver.find_element(*loc).click()
time.sleep(0.5)
# 输入账号
driver.find_element_by_id('u').send_keys("xxxx")
# 输入密码
driver.find_element_by_id('p').send_keys('xxxxx')
driver.find_element_by_id('login_button').click()
time.sleep(3)
# 退出
driver.quit()
iframe骚操作:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time # 创建一个Chrome对象
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 访问腾讯课堂
driver.get('https://ke.qq.com/') # 定位登录按钮,并点击操作,利用显示等待
loc = (By.ID, 'js_login')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_id('js_login').click() # 定位QQ登录按钮,并点击操作,显示等待
loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(1) # iframe切换方式二:下标、name属性、webelement对象、元素定位元组四种
# iframe骚操作,EC条件中,frame_to_be_available_and_switch_to_it这个条件,说明iframe有效并切换到iframe中
# 切换到登录的iframe页面中
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]')))
driver.find_element_by_id('switcher_plogin').click()
time.sleep(1)
# 定位输入框,输入账户名、密码
driver.find_element_by_id('u').send_keys('xxx')
driver.find_element_by_id('p').send_keys('xxx')
# 点击登录按钮
driver.find_element_by_id('login_button').click()
time.sleep(3) # 关闭浏览器
driver.quit()
alert弹框:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC # 创建一个Chrome会话
driver = webdriver.Chrome()
# 访问某网站
driver.get("http://xxx.com")
# 做一个操作,出现alert弹窗
driver.find_element_by_id('xxx').click() # 方式一:
# 切换到alert弹窗
alert_1 = driver.switch_to.alert # 方式二(骚操作):
# EC条件,alert弹框已出现,并切换到alert弹框中
alert_2 = WebDriverWait(driver, 10).until(EC.alert_is_present()) # 三种弹框,分别的操作方式
# 点击确定,关闭弹窗
alert_1.accept()
alert_2.accept()
# 点击取消
alert_1.dismiss()
alert_2.dismiss()
# 输入文本内容
alert_1.send_keys('xxx')
alert_2.send_keys('xxx') # 关闭浏览器
driver.quit()
JavaScript三种弹框方式:https://www.w3school.com.cn/js/js_popup.asp
最新文章
- VS2015 自动添加头部注释
- mysql基础语法及拓展到web中的sql注入
- dpkg 被中断,您必须手工运行 sudo dpkg -configure -a 解决
- MySQL删除重复记录只保留一条
- Android EditView 阻止软键盘自动弹出
- Intent.Action
- ROS服务的理解
- 关于eclipse中代码与SVN服务器关联问题
- Backdoor CTF 2013: 电子取证 250
- anaconda安装加速镜像问题解决
- RecyclerView嵌套RecyclerView
- TensorFlow之CNN:运用Batch Norm、Dropout和早停优化卷积神经网络
- Docker run 命令
- linux服务器查看tcp链接shell
- typescript 的安装
- 找不到System.Web.Optimization命名空间
- 干货|基于 Spring Cloud 的微服务落地
- static成员函数不能调用non-static成员函数
- 微信小程序——wxParse使用方法
- 实现C++标准库string类的简单版本
热门文章
- Linux中git用https连接时不用每次输入密码
- 2018-2019-2 20175211 实验四《Android程序设计》实验报告
- 自顶向下深入分析Netty(六)--Channel总述
- 引用fastclick.js或使用触屏监听 滑动屏幕报错:解决[Intervention] Unable to preventDefault inside passive event listener
- UDP用于保持大量终端的在线与控制,应用与业务则通过TCP去实现。这个和FTP服务控制与数据分离,采取不同的连接,有异曲同工之处 端口映射老化时间
- LiveCD 修复Grub引导
- 搭建Portainer可视化界面(转)
- PMP 第9~10章错题总结
- Python - Django - 中间件 process_exception
- 【Spring Boot学习之十一】整合mongoDB