1.Alert类
在UI的自动化测试实战中,针对弹出框的处理,主要使用的是Alert的类这部分,在javaScript的技术体系中,针对弹出框的部分,主要涉及到Alert警告框,Confirm确认框,Prompt消息框。下来主要详细的说下Alert里面每个方法的具体使用,具体源码如下:
在Alert的类里面,涉及到的方法以及方法的作用主要汇总为如下:
text:获取弹出的文本信息
accept:是接受Confirm弹出框
dismiss:是决绝接受Confirm弹出框
sene_keys是Prompt消息对话框里面想要输入的内容
分为三种弹出框
1.1警告框 :alert.text
在我们出现这种弹窗的时候我们想要读取里面的弹窗内容就需要
利用switch_to.alert.text来读取弹窗里面的内容
或者进行类的实例化 输出 其中driver是构造方法 所以需要赋值使其实例化
代码:
1 from selenium import webdriver
2 from selenium.webdriver.common.alert import Alert
3 import time as t
4
5 '''警告框'''
6 driver=webdriver.Chrome()
7 driver.maximize_window()
8 driver.get('file:///D:/jiachao/app/ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E8%AD%A6%E5%91%8A%E6%A1%86.html')
9 t.sleep(5)
10 driver.find_element_by_xpath('/html/body/div/input').click()
11 #进行类的实例化 输出 其中 driver是构造方法 所以需要赋值实例化
12 # print(Alert(driver=driver).text)
13 # t.sleep(5)
14 print(driver.switch_to.alert.text) #通过切换到弹窗里面进行读取内容
15 t.sleep(5)
16 driver.quit()
这是输出text里面的两种方式
1.2确认框:确认:accept() 取消dismiss()
当我们看到下图的时候我们就应该运用确认框相关的代码 以及思考怎么执行
解决的思路为 我们通过alert进入到弹窗中执行accept的操作以及dismiss的操作
1 from selenium.webdriver.common.alert import Alert
2 from selenium import webdriver
3 import time as t
4
5 driver=webdriver.Chrome()
6 driver.maximize_window()
7 driver.get('file:///D:/jiachao/app/ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E7%A1%AE%E8%AE%A4%E6%A1%86.html')
8 driver.find_element_by_xpath('/html/body/center/input').click()
9 t.sleep(5)
10 # Alert(driver=driver).accept()
11 driver.switch_to.alert.accept()
12 t.sleep(5)
13 driver.refresh()
14 t.sleep(5)
15 driver.find_element_by_xpath('/html/body/center/input').click()
16 t.sleep(5)
17 driver.switch_to.alert.dismiss()
18 t.sleep(5)
19 driver.quit()
在工作场景中用于确认与取消的交互上
1.3消息对话框:alert.send_keys
当我们想在弹出的框中进行输入
就可以使用代码来进行操作让弹窗内部输入文字
1 from selenium import webdriver
2 import time as t
3
4 driver=webdriver.Chrome()
5 driver.maximize_window()
6 driver.get('file:///D:/jiachao/app/ui%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86.html')
7 driver.find_element_by_xpath('/html/body/center/input').click()
8 t.sleep(5)
9 driver.switch_to.alert.send_keys('帅哥')
10 t.sleep(5)
11 driver.switch_to.alert.accept()
12 t.sleep(5)
13 driver.quit()
在工作中通常运用输入关键字 输入账号等操作中使用
2.ActionChains类
Action主要是针对鼠标事件的处理,在鼠标事件中常用的交互为悬浮,双击,有以及右键等
操作:如果想使用ActionChains的美,首先需要导入它,导入的命令为:
2.1:悬浮 move_to_element(settings).perform()
1 from selenium import webdriver
2 from selenium.webdriver.common.action_chains import ActionChains
3 import time as t
4 driver=webdriver.Chrome()
5 driver.maximize_window()
6 driver.get('https://www.baidu.com/')
7 t.sleep(5)
8 #针对ActionChains进行实例化 move_to_element它是ActionChains的方法
9 obj=ActionChains(driver=driver)
10 settings=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
11 obj.move_to_element(settings).perform()
12 t.sleep(5)
13 #点击搜索按钮
14 driver.find_elem ent_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()
15 t.sleep(5)
16 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()
17 t.sleep(5)
18 print(driver.switch_to.alert.text)
19 t.sleep(5)
20 driver.switch_to.alert.accept()
21 t.sleep(5)
22 driver.quit()
2.2右键操作
右键使用到的方法为content_click()的方法,下面就以百度搜索输入框为案例,来演示右键的
操作,具体实现的代码为:
1 from selenium.webdriver.common.action_chains import ActionChains
2 from selenium import webdriver
3 import time as t
4 driver=webdriver.Chrome()
5 driver.maximize_window()
6 driver.get('https://pan.baidu.com/')
7 t.sleep(5)
8 driver.find_element_by_id('TANGRAM__PSP_4__smsSwitchWrapper').click()
9 t.sleep(5)
10 #输入手机号2
11 driver.find_element_by_id('TANGRAM__PSP_4__smsPhone').send_keys('13555204319')
12 t.sleep(5)
13 driver.find_element_by_id('TANGRAM__PSP_4__smsTimer').click()
14 t.sleep(45)
15 #点击登录
16 driver.find_element_by_id('TANGRAM__PSP_4__smsSubmit').click()
17 t.sleep(5)
18 #对ActionChiains
19 obj=ActionChains(driver=driver)
20 #获取元素属性的对象
21 jiachao=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[3]/div/div/dd[3]/div[2]/div[1]/a')
22 t.sleep(5)
23 obj.context_click(jiachao).perform() #整个过程完成右击
24 t.sleep(5)
25 driver.quit()
2.3鼠标双击
double_click一般主要应用于数据的交互方面,比如添加用户姓名的按钮,假设程序规定用户名是唯一的,那么双击后是否插入了两条用户名称一样的信息了,这就需要来验证,提交数据后,然后在数据列表中使用用户名名称来查询,查询是否存在两条数据,一般而言,前后端的程序员都是会处理这些的,但是作为测试我们还是需要验证这些测试场景。下面主要结合百度搜索来作为案例
1 from selenium.webdriver.common.action_chains import ActionChains
2 from selenium import webdriver
3 import time as t
4
5 driver=webdriver.Chrome()
6 driver.maximize_window()
7 driver.get('https://www.baidu.com/')
8 t.sleep(5)
9 obj=ActionChains(driver=driver)
10 driver.find_element_by_id('kw').send_keys('美女')
11 t.sleep(5)
12 so=driver.find_element_by_id('su')
13 obj.double_click(so).perform() #执行双击
14 t.sleep(5)
15 driver.quit()
当中我们可以看到
3.WebDriverWait
在ui的自动化测试,经常会由于网络加载慢的问题导致资源加载不出来,从而影响测试的效率,之前我们对这种的处理方案是使用了time库里面的sleep()方法来休眠几秒钟,但是这样的方式毕竟不是很好的解决方案,在UI自动化测试中,关于等待的部分,主要汇总为如下三点,具体如下:
1、固定等待,也就是使用sleep()方法
2、隐式等待,使用的方法是implicit_wait的方法,可以把它理解为设置觜长的等待时间
3、显示等待,主要指的是程序每隔一段时间时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpection的异常信息。
3.1.WebDriverWait类分析
在UI的自动化测试中,显示等待主要使用的是类WebDriverWait,它里面提供了很多的解决方案,下面具体对它进行分析,我们要使用它,那么我们就首先需要导入它,导入的代码具体如下:
from selenium.webdriver.support.ui import WebDriverWait
其中在until方法里面,该方法的形式阐述中,method它首先是一个方法,其实这个方法就是调用expected_conditions,
在模块中的函数或者是方法,那么导入它的方式具体为:
from selenium.webdriver.support import expected_conditions as es
调用这个模块里面的函数以及方法后,一般会返回两种结果信息,如果是True程序就会继续执行,如果是False那么就会报TimeOutExpxction的异常信息
3.2.元素可见是操作
下面我们具体来看显示等待的案例应用element_to_be_clickable是元素可见的时候进行操作,当然相反的是元素不可见那么久无法操作,这个主要指的是资源加载出来进行具体的操作,下面以百度搜索为案例来演示这部分,涉及到的源码为:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait #显示等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es #异常处理 适用于浏览器的异常处理
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/')
driver.implicitly_wait(30)
wait=WebDriverWait(driver=driver,timeout=10).until(es.element_to_be_clickable((By.ID,'kw')))
# wait=WebDriverWait(driver,10).until(lambda x: x.find_element_by_id('kw'))
wait.send_keys('等待')
t.sleep(5)
driver.quit()
如果信息错误的话,等待30秒后,由于元素属性错误查找不到,那么错误的信息就会显示超时.
3.3.指定元素的文本位置
这个方法主要应用于错误文本信息的验证,我们首先需要错误文本信息显示出来才能够进行断言的验证,使用到的方法为:text_to_be_persent_in_element,下面我们主要是以sina email 为案例来演示
下部分的具体应用,具体代码如下
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait #显示等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es #异常处理 适用于浏览器的异常处理
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get('https://mail.sina.com.cn/')
driver.find_element_by_class_name('loginBtn').click()
divText=WebDriverWait(driver=driver,timeout=10).until(es.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')))
assert divText.text=='请输入邮箱名'
driver.quit()
3.4.判断元素是否可见
这里以百度首页的关于百度为案例,使用到的方法为:visibilty_of_element_located,具体实现的源码为:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait #显示等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es #异常处理 适用于浏览器的异常处理
import time as t
driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/')
driver.implicitly_wait(30)
aboutBaidu=WebDriverWait(driver=driver,timeout=10).until(es.element_to_be_clickable((By.LINK_TEXT,'关于百度')))
t.sleep(5)
aboutBaidu.click()
driver.quit()