UI自动化测试ActionChains类/WebDriverWait类/keys类/JS类实战
iFrame定位
遇到iFrame框架,解决问题的思路是:
1.先进入到iFrame框架
2.然后再定位框架里面的元素属性
怎么判断?
当你使用所有的元素定位的方式并且都是正确的,但是就是提示找不到。那么这时查看源码是否存在iFrame框架。如果存在,通过三种方式可以进入到iFrame框架:以下用新浪邮箱为例
1.通过ID
2.通过索引
3.通过name(基本不使用)
一、ActionChains类
ActionChains主要是针对鼠标事件的处理,在鼠标事件中常用的交互为悬浮,双击,以及右键等
操作。如果想使用ActionChains的类,首先需要导入它,导入的命令为:
from selenium.webdriver.common.action_chains import ActionChains
1、鼠标事件
鼠标时间就以百度搜索的设置来案例,鼠标悬浮到设置,就会显示出下拉框的内容信息,
具体交互信息如下:
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time as t driver = webdriver.Chrome() driver.maximize_window() driver.get('http://www.baidu.com') #鼠标事件进行实例化 obj=ActionChains(driver=driver) #要定位的元素属性的对象 setting=driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/span') obj.move_to_element(setting).perform() t.sleep(6) #点击搜索设置 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/div[1]/div/a[1]/span').click() t.sleep(5) driver.quit()
2、右键操作
右键使用到的方法为content_click() 的方法,下面就以百度搜索输入框为案例,来演示右键的操作
3、双击操作,以百度搜索框为例
double_click一般主要应用于数据的交互方面
二、WebDriverWait类
在UI的自动化测试中,显式等待主要使用的是类WebDriverWait,它里面提供了很多的解决方案,下面具体对它进行分析,我们要使用它,那么我们就首先需要到人它,导入的代码如下:
from selenium.webdriver.support.ui import WebDriverWait
在ui自动化测试中,关于等待的部分,主要汇总如下三点:
1、固定等待,也就是使用sleep()方法
2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间
下面以百度为例
3、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpection的异常信息。
这里以百度操作为例,在搜索框输入“接口测试”,最长等待60秒,再获取输入的文本信息值
4、指定元素的文本信息
这个方法主要应用于错误文本信息的验证,我们首先需要错误文本信息显示出来才能够进行断言的验证,使用到的方法为:text_to_be_present_in_element,
这里以新浪邮箱为例,在不输入用户名和密码的情况下,点击登录,看是否能跳出“请输入邮箱名”的文本信息。
text_to_be_present_in_element()元素的文本资源加载出来 driver = webdriver.Chrome() driver.maximize_window() #浏览器最大化固定加上 driver.get('http://mail.sina.com.cn/') driver.implicitly_wait(60) #隐式等待,最长等待60秒 driver.find_element_by_class_name('loginBtn').click() t.sleep(5) divText=WebDriverWait( driver=driver, timeout=10).until( method=es.text_to_be_present_in_element(( By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]'),text_='请输入邮箱名')) driver.quit()
5、判断元素是否可见
这里以百度的“关于百度”为例,进行点击,使用到的方法为:visibilty_of_element_located
"""判断元素是否可见""" driver = webdriver.Chrome() driver.maximize_window() #浏览器最大化固定加上 driver.get('http://www.baidu.com/') driver.implicitly_wait(60) #隐式等待,最长等待60秒 about=WebDriverWait( driver=driver, timeout=10).until( method=es.visibility_of_element_located(( By.LINK_TEXT, '关于百度'))) print(about.text) about.click() t.sleep(5) driver.quit()
三、keys类实战
在UI的自动化测试中,有时候也会遇到键盘事件的操作,使用到的类为Keys,导入方式具体如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get('http://www.baidu.com') so=driver.find_element_by_id('kw') so.send_keys('Selenum3') #全部选择输入的关键字 so.send_keys(Keys.COMMAND,'a') t.sleep(3) #然后复制 so.send_keys(Keys.COMMAND,'c') t.sleep(3) #然后删除 so.send_keys(Keys.BACKSPACE) t.sleep(3) #然后复制关键字 so.send_keys(Keys.COMMAND,'v') t.sleep(5) driver.quit()
在UI的自动化测试中,我们也是需要使用JS来处理一些特殊的交互,比如针对浏览器的滑动操作,以及针对富文本的特殊处理,和针对只读属性的时间控件的处理。下面通过实际的案例来演示这部分的具体应用和案例实战。
1、浏览器的滑动
浏览器的滑动主要分为浏览器的向上和向下,比如我们就以boss直聘为案例,我们进行关键字的搜索后,想点击下一步的操作,但是下一步无法展示出来,就需要把页面滑动到底部才可以展示出来。
import time from selenium import webdriver import time as t '''浏览器滑动''' driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.zhipin.com/xian/?sid=sem_pz_bdpc_dasou_title") driver.implicitly_wait(30) driver.find_element_by_name("query").send_keys("软件测试") driver.find_element_by_xpath("/html/body/div[1]/div[3]/div/div[1]/div[1]/form/button").click() t.sleep(3) #浏览器滑动到底部 down="var q=document.documentElement.scrollTop=1000" driver.execute_script(down) t.sleep(3) #点击下一页 driver.find_element_by_class_name("next").click() t.sleep(5) driver.execute_script(down) t.sleep(5) #浏览器滑动到顶部 up="var q=document.documentElement.scrollTop=0" driver.execute_script(up) t.sleep(3) driver.quit()
2、富文本的处理
普通方法
#富文本操作 # driver = webdriver.Chrome() # driver.maximize_window() # driver.get('https://uutool.cn/ueditor/') # driver.implicitly_wait(30) # driver.switch_to.frame('ueditor_0') # driver.find_element_by_xpath('/html/body').send_keys('jiahisuxgs') # t.sleep(5) # driver.quit()
时间控件解决操作步骤:
那么我们需要填写时间的属性,具体解决问题的步骤为:
取消时间控件的只读属性 取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。
#时间控件 def startTime(driver,content): '''开始时间控件''' js="$(\"input[placeholder='开始时间≥当前时间']\").removeAttr('readonly');" \ "$(\"input[placeholder='开始时间≥当前时间']\").attr('value','{0}')".format(content) driver.execute_script(js) def endTime(driver,content): '''结束时间控件''' js="$(\"input[placeholder='结束时间>开始时间']\").removeAttr('readonly');" \ "$(\"input[placeholder='结束时间>开始时间']\").attr('value','{0}')".format(content) driver.execute_script(js) driver = webdriver.Chrome() driver.maximize_window() driver.get('file:///D:/Time/index.html') t.sleep(3) startTime(driver=driver,content='2001-01-01 00:00') t.sleep(3) endTime(driver=driver,content='2020-11-11 00:00') t.sleep(3) driver.get_screenshot_as_file(filename='index.png')#截图操作 driver.quit()
获取到的截图: