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
selenium中的元素操作之三大切换(二)的更多相关文章
- selenium中的元素操作之三大等待(一)
等待时做什么,为什么使用等待 在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完 ...
- selenium中的元素操作之下拉列表操作(四)
下拉列表操作中分为两种:select.非select 1.非select的下拉框操作 非select下拉列表操作与网页元素操作一致,找到元素,定位元素,设置等待,点击元素等等 接下来操作百度的设置按钮 ...
- 【Selenium】selenium中隐藏元素如何定位?
前言 面试题:selenium 中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚 ...
- 巧妙利用selenium中的JS操作来处理特殊的文本框
在使用selenium对页面进行相关操作时,有时候会遇到以下三种情况: 1.日期框:无法直接输入文本,必须要选择某一天的日期并点击才会填入文本框: 2.检索框:可以直接输入文本,但必须要点击根据输入的 ...
- selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
1.在寻找元素时,加上显示等待或者隐式等待,这样在对元素进行操作之前保证元素被找到,进而提高成功率: 2.在对元素操作之前,比如click,如果该元素未display(非hidden),就需要先滚动到 ...
- Selenium webdriver Java 元素操作
本来这些东西网上一搜一大堆,但是本着收集的精神,整理一份放着吧!哈!哈!哈! 1. 输入框(text field or textarea) WebElement element = driver.fi ...
- python selenium中等待元素出现及等待元素消失操作
在自动化测试中,很多时候都会有等待页面某个元素出现后能进行下一步操作,或者列表中显示加载,直到加载完成后才进行下一步操作,但时间都不确定,如下图所示 幸运的是,在selenium 2后有一个模块exp ...
- selenium webdriver python 元素操作
常用操作 click 点击某个元素 driver.find_element_by_id(“su”).click() clear driver.find_element_by_id(“kw”).cl ...
- <自动化测试>之<selenium API 查找元素操作底层方法>
搜罗了一些查找元素的除标准语句外,另外的语句使用方法,摘自 开源中国 郝云鹏driver = webdriver.Chrome(); 打开测试页面 driver.get( "http://b ...
随机推荐
- NULL与nullptr
[https://blog.csdn.net/weixin_40237626/article/details/82560012] 其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参 ...
- Gamma阶段第五次scrum meeting
每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...
- java 注解,动态代理
秒懂,Java 注解 (Annotation)你可以这样学 深入理解Java注解类型(@Annotation) 注解可以理解为标签. 当开发者使用了Annotation 修饰了类.方法.Field 等 ...
- 使用analyze命令统计信息
① 搜集和删除索引.表和簇的统计信息② 验证表.索引和簇的结构③ 鉴定表和簇和行迁移和行链接针对analyze的搜集和删除统计信息功能而言Oracle推荐使用DBMS_STATS包来代替analyze ...
- DLL注入实践
Windows系统大量使用dll作为组件复用,应用程序也会通过dll实现功能模块的拆分.DLL注入技术是向一个正在运行的进程插入自有DLL的过程. Window下的代码注入 常见的Windows代码注 ...
- awk(gawk)文本报告生成器
awk是gawk的链接文件,是一种优良的文本处理工具,实现格式化文本输出,是Linux和Unix现有环境中功能最强大的数据处理引擎之一.这种编程及数据操作语言的最大功能取决于一个人拥有的知识量,使用& ...
- 【LeetCode算法-53】Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- shell基础知识7-字段分隔符与迭代器
什么是内部字段分隔符 内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程中的一个重要概念.在处理 文本数据时,它的作用可不小. 作为分隔符,IFS有其特殊用 ...
- java https post请求并忽略证书,参数放在body中
1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...
- Xamarin.Android UnauthorizedAccessException: Access to the path is denied
进行文件读写,勾选了权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" / ...