三、UI自动化测试03--操作方法API
目录
- 一、元素操作⽅法
- 二、浏览器操作⽅法
- 1. Part1: 设置最⼤化/⼤⼩/位置
- 扩展: Web/APP 项⽬⻚⾯布局坐标系示意
- 2. Part2: 后退/前进/刷新
- 3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址
- 三、获取元素信息⽅法
- 1. Part1: 获取⼤⼩/⽂本/属性值
- 2. Part2: 判断元素是否可⻅/可⽤/可选中
- 四、鼠标操作
- 1. 右键单击[了解]
- 2. 左键双击[了解]
- 3. 拖拽操作[了解]
- 4. 悬停操作[重点]
- 五、键盘操作
- 1. 案例实现
- 六、元素等待
- 1. 隐式等待
- 案例实现
- 2. 显式等待
- 案例实现
- 3. 隐式等待和显示等待的对⽐
一、元素操作⽅法
- 需求:打开注册A⻚⾯,完成以下操作
- 1).通过脚本执⾏输⼊⽤户名:admin;密码:123456;电话号码:18611111111;电⼦邮件:123@qq.com
- 2).间隔3秒,修改电话号码为:18600000000
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册A⻚⾯,完成以下操作
# 1).通过脚本执⾏输⼊⽤户名:admin;密码:123456;电话号码:18611111111;电⼦邮件:123@qq.com
driver.find_element_by_id('userA').send_keys('admin')
driver.find_element_by_id('passwordA').send_keys('123456')
tel = driver.find_element_by_id('telA')
tel.send_keys('18611111111')
driver.find_element_by_name('emailA').send_keys('123@qq.com')# 2).间隔3秒,修改电话号码为:18600000000
# 注意: 在使⽤操作中, ⼀般对于输⼊框元素, 都要先执⾏清空, 再执⾏输⼊, 避免操作错误
# 清空操作: 元素对象.clear()
sleep(3)
tel.clear()
tel.send_keys('18600000000')# 3).间隔3秒,点击‘注册’按钮
sleep(3)
driver.find_element_by_css_selector('button').click()# 4).间隔3秒,关闭浏览器
# 5).元素定位⽅法不限# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
二、浏览器操作⽅法
1. Part1: 设置最⼤化/⼤⼩/位置
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1. maximize_window() [重点]最⼤化浏览器窗⼝ --> 模拟浏览器最⼤化按
钮
# 说明: 如果能够在打开⻚⾯时, 全屏显示⻚⾯, 就能尽最⼤可能加载更多的⻚⾯元素, 提⾼可定位性
driver.maximize_window()# 2. set_window_size(width, height) [了解]设置浏览器窗⼝⼤⼩ --> 设置浏览器宽、⾼(像素点)
# 场景: 查看⻚⾯是否可以⾃适应(Web 和 APP 端切换)时使⽤
driver.set_window_size(300, 300)# 3. set_window_position(x, y) [了解]设置浏览器窗⼝位置 --> 设置浏
览器位置
driver.set_window_position(300, 300)# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
扩展: Web/APP 项⽬⻚⾯布局坐标系示意
2. Part2: 后退/前进/刷新
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('http://www.baidu.com')# 定位搜索框输⼊内容
driver.find_element_by_id('kw').send_keys('⿊⻢⻢')
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)# 后退: 浏览器对象.back()
driver.back()
sleep(2)# 前进: 浏览器对象.forward()
driver.forward()
sleep(2)# 刷新[重点]: refresh()
# 说明: 刷新动作是重新向服务器发起当前⻚⾯的请求!
driver.refresh()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址
# 1. 导⼊模块
from time import sleep
from selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 点击新开新浪⽹⻚
driver.find_element_by_partial_link_text('访问').click()
sleep(2)# 7. close() 关闭当前窗⼝ --> 模拟点击浏览器关闭按钮
# 8. quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗⼝
# 9. title 获取⻚⾯title
# 10. current_url 获取当前⻚⾯URL# 场景: 浏览器的标题和 URL 地址属性, 可以⽤来做断⾔使⽤
print('关闭前⻚⾯标题:', driver.title)
print('关闭前⻚⾯地址:', driver.current_url)# 说明: 在没有实现浏览器⻚⾯切换操作前, close() ⽅法关闭的是原始⻚⾯!
# 场景: 关闭单个⻚⾯时使⽤
driver.close()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
# 说明: 关闭所有⻚⾯
driver.quit()
三、获取元素信息⽅法
1. Part1: 获取⼤⼩/⽂本/属性值
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1. size 返回元素⼤⼩
# 场景: ⽤于判断⻚⾯元素布局尺⼨是否合理时使⽤
username = driver.find_element_by_id('userA')
print('⽬标元素的尺⼨为:', username.size)# 2. text 获取元素的⽂本
# 场景: ⽤于切换⻚⾯后, 对⻚⾯内容特定元素的⽂本信息的获取(⽤作断⾔使
⽤)
btn = driver.find_element_by_tag_name('button')
print('⽬标元素的⽂本为:', btn.text)# 3. get_attribute("xxx") 获取属性值,传递的参数为元素的属性名
# 场景: 有些情况下, 需要获取⽬标元素的特定属性值作为判断依据或数据
# 语法: 元素对象.get_attribute("属性名")
link = driver.find_element_by_link_text('浪')
print('⽬标元素的地址为:', link.get_attribute('href'))# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. Part2: 判断元素是否可⻅/可⽤/可选中
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 4. is_displayed() 判断元素是否可⻅
# 说明: 该⽅法多⽤于对元素在⻚⾯内显示效果的判断时使⽤(元素不显示不意味着⼀定⽆法定位)
span = driver.find_element_by_name('sp1')
print('⽬标元素是否显示:', span.is_displayed())# 5. is_enabled() 判断元素是否可⽤
# 说明: 该⽅法多⽤于判断⽬标元素是否可以进⾏交互时使⽤
can_btn = driver.find_element_by_id('cancelA')
print('⽬标元素是否可⽤:', can_btn.is_enabled())# 6. is_selected() 判断元素是否选中,⽤来检查复选框或单选按钮是否被选
中
# 场景: 如购物⻋⻚⾯, 不全选商品, 不让结算
check = driver.find_element_by_id('lyA')
print('⽬标元素是否被选中:', check.is_selected())# 扩展: 判断条件
if check.is_selected(): # 选中的判断pass
if not check.is_selected(): # 未选中的判断pass# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
四、鼠标操作
1. 右键单击[了解]
# 1. 导⼊模块
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册⻚⾯A,在⽤户名⽂本框上点击⿏标右键
# 0> 定位⽬标元素
username = driver.find_element_by_id('userA')
# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⿏标⽅法
# 说明: ⿏标右键只能展示右键菜单内容, ⽽菜单中的元素⽆法操作!
action.context_click(username)
# 3> 执⾏⽅法: 该⽅法必须调⽤, 否则上述代码⽆效!!!!!!
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. 左键双击[了解]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册⻚⾯A,输⼊⽤户名admin,暂停3秒钟后,双击⿏标左键,选中admin
username = driver.find_element_by_id('userA')
username.send_keys('admin')
sleep(3)# 说明: 使⽤键盘快捷键 Ctrl + A, 也能实现全选
# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⿏标动作(传⼊⽬标元素)
action.double_click(username)
# 3> 执⾏⽅法
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. 拖拽操作[了解]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/drag.html')# 需求:打开‘drag.html’⻚⾯,把红⾊⽅框拖拽到蓝⾊⽅框上
red = driver.find_element_by_id('div1')
blue = driver.find_element_by_id('div2')# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⽅法(传⼊⽬标元素)
action.drag_and_drop(red, blue)
# 3> 执⾏⽅法
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
4. 悬停操作[重点]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 定位⽬标元素
btn = driver.find_element_by_tag_name('button')# 实例化⿏标对象
action = ActionChains(driver)
# 调⽤⿏标⽅法
# 说明: 该⽅法在实际应⽤中, 处理悬停⿏标才会出现的菜单时使⽤
# 注意: 该⽅法执⾏时, 不要动⿏标!!!!!!
action.move_to_element(btn)
# 执⾏⽅法
action.perform()# 另⼀种⿏标操作的写法:(在其他编程语⾔中称为链式编程)
# ActionChains(driver).move_to_element(btn).perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
五、键盘操作
1. 案例实现
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.keys import Keys# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册A⻚⾯,完成以下操作
# 1). 输⼊⽤户名:admin1,暂停2秒,删除1
username = driver.find_element_by_id('userA')
username.send_keys('admin1')
sleep(2)
# 删除: BACK_SPACE 等价于 BACKSPACE
username.send_keys(Keys.BACK_SPACE)# 2). 全选⽤户名:admin,暂停2秒
# 说明: macOS 系统需要使⽤ Command + a
username.send_keys(Keys.CONTROL, 'a') # Windows 系统
# username.send_keys(Keys.COMMAND, 'a') # macOS 系统
sleep(2)# 3). 复制⽤户名:admin,暂停2秒
username.send_keys(Keys.CONTROL, 'c') # Windows 系统
# username.send_keys(Keys.COMMAND, 'c') # macOS 系统
sleep(2)# 4). 粘贴到密码框
# 说明: 之所以能够复制完内容后, 在任意位置处可以进⾏粘贴, 是通过系统的剪切板实现的
password = driver.find_element_by_id('passwordA')
password.send_keys(Keys.CONTROL, 'v') # Windows 系统
# password.send_keys(Keys.COMMAND, 'v') # macOS 系统# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
六、元素等待
1. 隐式等待
说明:
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔⼀段时间[不可控制]后再去定位元素;
如果在达到最⼤时⻓时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException 。
- 注意:
-
- 隐式等待是全局有效, 只需要设置⼀次即可
-
- 当隐式等待被激活时, 虽然⽬标元素已经出现了,
- 但是还是会由于当前⻚⾯内的其他元素的未加载完成, ⽽继续等待, 进⽽增加代码的执⾏时⻓
案例实现
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%
8CA%E7%AD%89%E5%BE%85.html')# 设置隐式等待
driver.implicitly_wait(10)# 定位元素并输⼊
driver.find_element_by_id('userA').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. 显式等待
说明:
定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔⼀段时间[可以控制]后再去定位元素;
如果在达到最⼤时⻓时还没有找到指定元素,则抛出超时异常 TimeoutException
案例实现
-
需求:打开注册A⻚⾯,完成以下操作
-
1).使⽤显式等待定位⽤户名输⼊框,如果元素存在,就输⼊admin
-
driver.find_element_by_id(‘userA’).send_keys(‘admin’)
-
设置显式等待: 按住 Ctrl, ⿏标左键点击类名, 拷⻉示例代码, 根据实际需求修改对应参数即可
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA%E7%AD%89%E5%BE%85.html')"""
driver: 浏览器对象
timeout: 超时时⻓
poll_frequency: 定位⽅法执⾏间隔时⻓(默认 0.5 秒)
"""
element = WebDriverWait(driver, 10, 1).until(lambda x:
x.find_element_by_id('userA'))
# 说明: 元素操作⽅法没有代码提示, 需要⼿写
element.send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. 隐式等待和显示等待的对⽐
对⽐ | 元素个数 | 调⽤⽅式 | 异常类型 |
---|---|---|---|
隐式等待 | 全局 | 浏览器对象调⽤ | NoSuchElementException |
显式等待 | 单个 | 实例化对象调⽅法 | TimeoutException |
扩展: 强制等待(sleep) | 全局 | ⽅法 | NoSuchElementException |