Selenium web UI自动化测试——特殊API

1. 获取页面title和url

功能 实现方式
获取页面title driver.title
获取当前页面的url driver.current_url
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://wenku.baidu.com/')  #百度文库首页
title = driver.title  #获取页面title
print(title)  #打印title
url = driver.current_url  #获取当前页面的url
print(url)   #打印url

Selenium web UI自动化测试——特殊API_第1张图片
Selenium web UI自动化测试——特殊API_第2张图片

2. 浏览器前进、后退、刷新

功能 实现方式
前进 driver.forward()
后退 driver.back()
刷新 driver.refresh()
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/book/list/0')  #百度阅读-分类
time.sleep(3)
driver.find_element_by_css_selector("a[class='nav-index']>span").click()  #点击首页
time.sleep(3)
driver.back()  #后退,回到分类界面
time.sleep(3)
driver.forward()  #前进,回到首页
time.sleep(3)
driver.refresh()  #刷新,首页刷新

Selenium web UI自动化测试——特殊API_第3张图片

3. 浏览器尺寸设置

功能 实现方式
窗口最大化 driver.maximize_window()
自定义置窗口尺寸 driver.set_window_size(1200,800) 设置自定义窗口宽1200,高800,从左上角开始
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/book/list/0')  #百度阅读-分类
time.sleep(3)
driver.maximize_window()  #窗口最大化
time.sleep(5)
driver.set_window_size(1200,800)   #设置自定义窗口宽1200,高800,从左上角开始

4. 常用动作-输入框输入内容、清空内容、点击

功能 实现方式
输入框输入内容 .send_keys()
清空内容 .clear()
点击 .click() 所有控件都可以点击,只是有些控件点击后没有效果而已
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/')  #百度阅读首页
driver.maximize_window()  #窗口最大化
time.sleep(3)
driver.find_element_by_id('s-word-1').send_keys('软件测试')  #在输入框中输入软件测试
time.sleep(3)
driver.find_element_by_id('s-word-1').clear()  #清空输入框
time.sleep(3)
driver.find_element_by_id('s-word-1').click()  #点击输入框

5. 多种属性获取

功能 实现方式
判断定位的控件是否已经显示/加载出来 .is_displayed(),返回布尔类型
获取输入框的尺寸(长宽) .size ,返回一个字典类型
获取输入框中回显的值 .get_attribute(‘value’)
获取文本信息 .text
获取某项属性值 .get_attribute(‘href’),()中填入属性名
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/')  #百度阅读首页
driver.maximize_window()  #窗口最大化
time.sleep(3)

#判断定位的控件是否已经显示/加载出来了
dis = driver.find_element_by_class_name('s-submit').is_displayed()  
print(dis)  # 返回布尔类型,true或false

#获取输入框的尺寸(长宽),.size是个属性(property)方法,后面不需要加()
size = driver.find_element_by_id('s-word-1').size   
print(type(size))  #获取size的类型,是一个字典类型
print(size)  #获取size的值
print(size['height'])  #获取输入框的高

#获取输入框中回显的值
driver.find_element_by_id('s-word-1').send_keys('软件测试')  #输入框中输入软件测试
value = driver.find_element_by_id('s-word-1').get_attribute('value')  #获取输入框中回显的值
print(value)

#获取我的书架的文本信息
text = driver.find_element_by_class_name('nav-right-mybook').text   
print(text)

#获取我的书架的属性值,()中填入属性名
at = driver.find_element_by_class_name('nav-right-mybook').get_attribute('href')   
print(at)

Selenium web UI自动化测试——特殊API_第4张图片

6. 鼠标事件-移动、右击、双击、拖动

  • 类后面括号里面的内容,一般会走到_init_参数里面去(按住Ctrl再点击就可查看)
  • 导入鼠标事件的类:from selenium.webdriver.common.action_chains import ActionChains
功能 实现方式
鼠标移动到控件上 ActionChains(driver).move_to_element(ele).perform() ,perform:使前面的动作生效
右击 ActionChains(driver).context_click(ele).perform()
双击 ActionChains(driver).double_click(ele).perform()
拖动 ActionChains(driver).drag_and_drop(source,target)
偏移 ActionChains(driver).drag_and_drop_by_offset(source,100,0),将源控件往x=100,y=0偏移
from selenium.webdriver.common.action_chains import ActionChains  #导入鼠标事件的类
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')  #百度首页
driver.maximize_window()  #窗口最大化
time.sleep(3)
ele = driver.find_element_by_id('s-usersetting-top')  #百度首页-设置

ActionChains(driver).move_to_element(ele).perform()  #鼠标移动到ele上
time.sleep(3)
ActionChains(driver).context_click(ele).perform()  #右击
ActionChains(driver).double_click(ele).perform()  #双击

source = driver.find_element_by_link_text('新闻')   #源控件
target = driver.find_element_by_link_text('地图')   #目标控件
ActionChains(driver).drag_and_drop(source,target)  #拖动:将源控件拖动到目标控件
ActionChains(driver).drag_and_drop_by_offset(source,100,0)   #偏移:将源控件往x=100,y=0偏移

7. 键盘事件

  • 导入键盘事件的类:from selenium.webdriver.common.keys import Keys
  • 使用方法:类名.变量名,变量名可进入类里面查看
功能 实现方式
回退 .send_keys(Keys.BACK_SPACE)
全选 .send_keys(Keys.CONTROL,‘a’)
复制 .send_keys(Keys.CONTROL,‘c’)
粘贴 .send_keys(Keys.CONTROL,‘v’)
剪切 .send_keys(Keys.CONTROL,‘x’)
from selenium.webdriver.common.keys import Keys  #导入键盘事件的类
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://yuedu.baidu.com/')  #百度阅读首页
driver.maximize_window()  #窗口最大化
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys('软件测试')  #输入框中输入内容

#使用方法:类名.变量名,变量名可进入类里面查看
driver.find_element_by_class_name('s-word').send_keys(Keys.BACK_SPACE)  #回退——键盘上的退格键
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'a')  #Crtl+A  全选
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'c')  #Crtl+C  复制
time.sleep(3)
driver.find_element_by_class_name('s-word').click()
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'v')  #Crtl+V  粘贴
time.sleep(3)
driver.find_element_by_class_name('s-word').send_keys(Keys.CONTROL,'x')  #Crtl+X  剪切

Selenium web UI自动化测试——特殊API_第5张图片

8. 三种等待时间

等待时间一般适用于页面跳转时,有三种等待方式

功能 实现方式 说明
强制等待 time.sleep(3) 强制等待3秒,需要导入time模块
显式等待 WebDriverWait(driver,15,0.5).until(EC.presence_of_all_elements_located( (By.ID,“s-usersetting-top”))) 最大等待15秒,每隔0.5秒检测1次,直到当前页面已经加载出来了对应控件,需要导入3个类
隐式等待 driver.implicitly_wait(10) 可允许加载的最长时间,如果下面加载的控件提前加载出来了,程序继续往下走
  • 隐式等待时间可能存在一个问题
    如果要定位的控件是使用xpath定位的,且点击该控件后会跳转到下一个页面,跳转时一直在加载页面,如果跳转前的页面和跳转后的页面有相同的xpath路径,则程序会认为已经定位到了,但实际并没有定位到。
  • 解决办法:此时不要使用隐式等待时间,使用强制等待

Unti和Until not应用场景

  • Until:判断跳转到购物车页面是否成功时,判断这个页面的某一控件存在即说明已经跳到购物车界面
  • Until not:判断是否已经跳离当前页面时,判断这个页面的某一控件不存在即说明已经跳离该页面

显示等待时间需要导入以下3个类

  • from selenium.webdriver.support.ui import WebDriverWait from
  • selenium.webdriver.common.by import By from
  • selenium.webdriver.support import expected_conditions as EC
#显示等待时间需要导入以下3个类
from selenium.webdriver.support.ui import  WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

from selenium import webdriver
driver = webdriver.Chrome()
import  time   #强制等待需要导入的time模块
time.sleep(3)  #强制等待3秒
driver.implicitly_wait(10)  #隐式等待时间,可允许加载的最长时间,如果下面加载的控件3秒就加载出来了,程序继续往下走
#显式等待时间
ele = WebDriverWait(driver,15,0.5).until(EC.presence_of_all_elements_located(
    (By.ID,"s-usersetting-top")))  #最大等待15秒,每隔0.5秒检测1次,直到当前页面已经加载出来了对应控件,此处是by ID定位
ele = WebDriverWait(driver,15,0.5).until not(EC.presence_of_all_elements_located(
    (By.ID,"s-usersetting-top")))   #直到当前页面不存在这个控件

9. 多窗体切换

功能 实现方式 说明
打印当前的所有窗体信息 print(driver.window_handles) 一般是list形态
获取当前窗口句柄 print(driver.current_window_handle)
窗体切换 driver.switch_to.window(driver.window_handles[0]) 切换到第1个窗体
关闭当前窗口 driver.close()
关闭所有窗口 driver.quit()
from selenium import webdriver
import  time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')  #百度首页
driver.maximize_window()  #窗口最大化
driver.find_element_by_id('kw').send_keys('123')  #输入框中输入123
driver.find_element_by_id('su').click()  #点击搜索

print(driver.window_handles)  #打印当前的所有窗体信息,一般是list形态
time.sleep(3)
driver.find_element_by_xpath("//div[@id='1']/h3[1]/a[1]").click()  #点击一个链接
time.sleep(3)
print(driver.window_handles)  #再次打印所有的窗体信息
print(driver.current_window_handle)  #获取当前窗口句柄,即当前处于哪个窗口

driver.switch_to.window(driver.window_handles[0])  #窗体切换,切换到第1个窗体
driver.switch_to.window(driver.window_handles[1])  #窗体切换,切换到第2个窗体

driver.close()  #关闭当前窗口
driver.quit()   #关闭所有窗口,整个浏览器全部关掉

Selenium web UI自动化测试——特殊API_第6张图片

10. Alert

鼠标右击,无法查看元素的弹出框,就是alert
如:
Selenium web UI自动化测试——特殊API_第7张图片
Selenium web UI自动化测试——特殊API_第8张图片

driver.switch_to.alert.send_keys('test')  #向alert输入框输入内容

print(driver.switch_to.alert.text)        #获取alet的文本内容

driver.switch_to.alert.accept()           #点击正向按钮(确定、保存等)

driver.switch_to.alert.dismiss()          #点击反向按钮(取消、不保存等)

11. 截图

driver.get_screenshot_as_file("G:/test.png")  #截图保存到对应路径及名称,以.png结尾

Alert 界面下不能截图

12. Iframe

Selenium web UI自动化测试——特殊API_第9张图片

#iframe
#第一种方式
driver.switch_to.frame('')  #如果有id/name,且属性值不为空或不变,可以直接跟对应的属性值,就可以切到这个iframe里面
#要注意有时候id是动态可变的-后面加有时间戳的情况

#第二种方法-万能
dd = driver.find_element_by_xpath("")  #先定位到这个iframe
driver.switch_to.frame(dd)  #再切换到iframe里面去
driver.switch_to.parent_frame()  #从子frame切回到父frame,如果有多个,需要多次切换
driver.switch_to.default_content()  #切回主文档

13. 下拉选择框处理

  • 下拉框处理,有3种方法:text/index/value
  • 对于select标签,需要导入select类: from selenium.webdriver.support.select import
    Select

注意

  • 下拉框只有是select标签时,才使用select类,有些下拉框是表格处理的(标签是dt),此时不能使用select处理。
  • 如果是表格类型,可以先将下拉框点开,再去定位下面的控件

Selenium web UI自动化测试——特殊API_第10张图片

房间数是一个select标签,定位房间数时,下拉框会自动收起来,如果要定位下拉框的内容,定位方法如下:

#下拉框处理,有3种方法:text/index/value
from selenium import webdriver
from selenium.webdriver.support.select import Select   #对于select标签,需要导入select类
driver = webdriver.Chrome()
driver.get('https://www.ctrip.com')  #进入携程官网
s = driver.find_element_by_id('J_roomCountList')     #先定位到下拉选择框

Select(s).select_by_visible_text('5间')   #通过text:visible_text表示页面可见的文本信息

Select(s).select_by_index(3)  #通过index:从下标0开始算起,此处选择的是4间房

Select(s).select_by_value('5')  #通过value:直接传入value值,value值是一个字符串

14. 时间控件处理

时间控件展开去定位基本无法定位到(时间会自动收起)

14.1 普通时间控件

Selenium web UI自动化测试——特殊API_第11张图片
时间控件是input标签,展开无法定位

#时间控件是input标签,展开无法定位
ele = driver.find_element_by_id('')  #先定位到时间控件
ele.clear()  #将时间输入框中的默认时间清除掉
ele.send_keys('2020-08-09')  #将想要选择的时间输入进去,格式需要符合要求,且时间需要是今天及其以后

14.2 带有readonly属性的时间控件

Selenium web UI自动化测试——特殊API_第12张图片
时间控件是input标签,但是有readonly属性,此时无法输入,可通过js代码定位,主要思路是先将只读属性移除,再输入内容

场景 定位方法 说明
如果时间控件有id属性 使用id定位
如果时间控件有name属性 使用name定位,ByName需要使用getElements,没有getElement使用方法 使用name定位到的是一组符合条件的控件,需要使用下标区分,下标从0开始
如果没有id,也没有name 使用TagName定位 所有控件都有标签类型(TagName)
#时间控件是input标签,但是有readonly属性,此时无法输入,可通过js代码定位
#document:html代码就是一个document树
#removeAttribute('readonly'):调用js的一个方法,将readonly属性移除

#1、如果时间控件有id属性
js = "document.getElementById('noticeEndTime').removeAttribute('readonly')"

#2、如果时间控件有name属性,ByName需要使用getElements,没有getElement使用方法
#使用name定位到的是一组符合条件的控件,需要使用下标区分,下标从0开始
js = "document.getElementsByName('noticeEndTime')[0].removeAttribute('readonly')"

#3、如果没有id,也没有name,可使用TagName定位(所有控件都有标签类型)
js = "document.getElementsByTagName('input')[0].removeAttribute('readonly')"

driver.execute_script(js)   #执行js,就可以将readonly属性移除
driver.find_element_by_name('noticeEndTime').send_keys('2020-08-09 13:25:23')  #移除后可输入

15. 滚动条处理

如果想要将滚动条滚动到某一个位置,需要多次调试坐标(多次尝试)

场景 定位方法
滚动到页面底部 scrollTop=10000
滚回页面顶部 scrollTop=0
滚动到页面的50% scrollHeight*0.5
水平方向滚动50% scrollWidth*0.5
相对当前坐标移动 window.scrollBy(0,-200)
移动到绝对坐标 window.scrollTo(0,1500)
#滚动到页面底部,可设置一个很大的值,此处设置的10000
#滚回页面顶部,scrollTop=0
#var q是定义的一个变量,去掉也可以
js = 'var q=document.documentElement.scrollTop=10000'
driver.execute_script(js)  #执行js

#滚动到页面的50%,x方向不变,在y方向上滚动
driver.execute_script('window.scrollTo(0,document.body.scrollHeight*0.5)')

#水平方向滚动50%
driver.execute_script('window.scrollTo(0,document.body.scrollWidth*0.5)')

driver.execute_script('window.scrollBy(0,-200)')  #相对当前坐标移动,scorllBy

driver.execute_script('window.scrollTo(0,1500)')  #移动到绝对坐标,scrollTo

16. 验证码处理

Selenium web UI自动化测试——特殊API_第13张图片

  • 登录时经常需要输入验证码,处理思路有以下几种:

1) 通过接口请求,拿到对应验证码信息,自行学习

2) 注入cookies,可自行学习:http://www.bcbxhome.com/bcbxxy/forum.php?mod=viewthread&tid=295&highlight=%E9%AA%8C%E8%AF%81%E7%A0%81

3) 让开发配合把验证码设置成万能验证码(最实用,不论输入什么内容都能登录进去,不会验证验证码是否正确)

你可能感兴趣的:(web,UI自动化,selenium,软件测试)