JavaScript实战+数据驱动
JavaScript实战
在UI的自动化测试中,我们也是需要使用JS来处理一些特殊的交互,比如针对浏览器的滑动操作,以及针对富文本的特殊处理,和针对只读属性的时间控件的处理。下面通过实际的案例来演示这部分的具体应用和案例实战。
浏览器的滑动
浏览器的滑动主要分为浏览器的向上和向下,比如我们就以百度搜索引擎为案例,我们进行关键字的搜索后,想点几下一步的操作,但是下一步无法展示出来,就需要把页面滑动到底部才可以展示出来。下面通过实际的案例来演示下这部分的具体应用,案例代码如下:
import time from selenium import webdriver from selenium.webdriver.common.by import By driver=webdriver.Chrome() driver.maximize_window() driver.get('http://wwww.baidu.com/') driver.implicitly_wait(30) driver.find_element(By.ID,'kw').send_keys('网易云课堂 接口测试') driver.find_element(By.ID,'su').click() time.sleep(2) #到浏览器底部 js='var q=document.documentElement.scrollTop=10000' #调用JS语言 driver.execute_script(js) time.sleep(3) #到浏览器的顶部 js1='var q=document.documentElement.scrollTop=0' driver.execute_script(js1) time.sleep(3) driver.close()
下面我们使用JS的方式来进行处理,实现在富文本里面输入我们需要的内容,具体涉及到的代码
def richText(driver,content): ''' 实现在富文本里面输入内容 :param driver: webdriver实例化后的对象信息 :param content: 富文本里面需要输入的文字内容 :return: ''' js="document.getElementById('ueditor_0').contentWindow.document.body.innerHTML='{0}'".format(content) driver.execute_script(js) driver=webdriver.Chrome() driver.maximize_window() driver.get('https://uutool.cn/ueditor/') driver.implicitly_wait(30) time.sleep(5) richText(driver=driver,content='自动化测试实战') time.sleep(3) driver.close()
下面具体来看时间控件的处理,时间控件很多时候是只读属性,具体见如下的HTML的代码:
在如上的代码中可以很清晰的看到它是只读属性,那么我们需要填写时间的属性,具体解决问题的步骤为:
-
取消时间控件的只读属性
-
取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。
下面通过具体的代码来实现这部分,实现在时间控件中填写我们想选择的时间,具体实现的代码为:
import time from selenium import webdriver 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:/test/%E4%BB%A3%E7%A0%81/Time/Time/index.html') time.sleep(2) startTime(driver=driver,content='2022-01-01 00:00:00') time.sleep(2) endTime(driver=driver,content='2022-09-16 23:59:59') time.sleep(2) driver.close()
数据驱动
在UI的自动化测试中,我们需要把测试使用到的数据分离到文件中,如果单纯的写在我们的测试模块里面,不是一个好的设计,所以不管是什么类型的自动化测试,都是需要把数据分离出来的。当然分离到具体的文件里面,文件的形式其实有很多的,这里主要说明JSON的文件和YAML的文件在UI自动化测试中的应用。
数据驱动:在自动化测试,把测试中的数据分离到文件中;
这样的一个过程叫数据驱动
JSON:json
CSV:csv
EXCEL:xlrd pip install slrd
YAML:pyyaml pip install pyyaml
mysql:pymqsql pip install pymysql
JSON文件
我们可以把测试的数据分离到JSON文件中,分离的数据具体为:
import json import time from selenium import webdriver from selenium.webdriver.common.by import By def readJson(): return json.load(open('sina.json','r',encoding='utf-8')) driver=webdriver.Chrome() driver.maximize_window() driver.get('https://mail.sina.com.cn/') driver.implicitly_wait(30) driver.find_element(By.CLASS_NAME,'loginBtn').click() time.sleep(2) divText=driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') #python原生断言 assert assert divText.text==readJson()['emailNull'] driver.close()
YAML文件
下面我们演示把测试数据存储到YAML文件里面,分离出来的文件内容为:
import yaml import time from selenium import webdriver from selenium.webdriver.common.by import By def readYaml(): with open('sina.yaml','r',encoding='utf-8') as f: return yaml.safe_load(f) driver=webdriver.Chrome() driver.maximize_window() driver.get('https://mail.sina.com.cn/') driver.implicitly_wait(30) driver.find_element(By.CLASS_NAME,'loginBtn').click() time.sleep(2) divText=driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') #python原生断言 assert assert divText.text==readYaml()['sina']['emailNull'] time.sleep(5) driver.refresh() driver.find_element(By.ID,'freename').send_keys('fdhdfgfd') time.sleep(3) driver.find_element(By.CLASS_NAME,'loginBtn').click() time.sleep(2) divText=driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') #python原生断言 assert assert divText.text==readYaml()['sina']['emailFormat'] time.sleep(5) driver.close()