UI自动化测试之四(JavaScrip类实战、数据驱动)

(一)JavaScrip类实战(js语句可以找开发帮忙编写)

1、实现上下滑动

场景:

在搜索后的所有数据中,实现下滑到底部以及上滑至顶部

 

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.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'

#调用JS语言
driver.execute_script(js1)
time.sleep(3)
driver.close()

2、富文本的处理

场景:

在富文本中插入文字的测试

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

 

def richTest(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(6)
richTest(driver=driver,content='你好,老弟')
time.sleep(3)
driver.close()

 

3、时间控件

原理:

时间控件(属于只读属性),通过Js取消他的readonly只读属性,我们把我们需要填写的数据通过value写到代码里

 

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

 

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:///C:/Users/Administrator/Desktop/Time/Time/index.html')
time.sleep(3)
startTime(driver=driver,content='2022-01-01 00:00:00')
time.sleep(3)
endTime(driver=driver,content='2022-09-16 23:59:59')
time.sleep(3)
driver.close()

 

(二)、数据驱动

定义:

在自动化测试中,把测试中的数据分离到文件中,这样的一个过程叫做数据驱动

表单分离存放数据的文件格式

 用到的库

Json

Json库

Csv

Csv

Excel

Xlrd(需要下载  pip install xlrd)

Yaml

Pyyaml(pip install pyyaml)

Mysql

Pymysql(pip install pymysql)

1、json格式:

场景介绍:

我们需要验证新浪邮箱登录时,不输入任何账号的情况下点击登录,测试他的弹窗是否符合要求,那么就需要把需求中的预期结果写到json文件中,然后通过自动化代码编写复现过程,并输出结果与json文件中的预期结果进行对比,没有报错信息即代表实际结果与预期结果一致。

 

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

import json

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(3)
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()['emileNull']
driver.close()

2、yaml格式:

我们需要验证新浪邮箱登录时,不输入任何账号以及输入不正确格式的账号的情况下点击登录,测试他的弹窗是否符合要求,那么就需要把需求中的预期结果写到yaml文件中,然后通过自动化代码编写复现过程,并输出结果与yaml文件中的预期结果进行对比,没有报错信息即代表实际结果与预期结果一致。

 

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

import yaml


def readYaml():
    with open('sina.yaml','r',encoding='utf-8') as f:
        return yaml.safe_load(f)

# print(readYaml(),type(readYaml()))
# print(readYaml()['sina']['emailNull'])
# print(readYaml()['sina']['emailFormat'])

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://mail.sina.com.cn/')
time.sleep(2)
#验证emailNull
driver.find_element(By.CLASS_NAME,'loginBtn').click()
so=driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
time.sleep(3)
assert so.text==readYaml()['sina']['emailNull']
time.sleep(5)
#刷新
driver.refresh()
#验证emailFormat
driver.find_element(By.ID,'freename').send_keys('qwer')
driver.find_element(By.CLASS_NAME,'loginBtn').click()
so=driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
time.sleep(3)
assert so.text==readYaml()['sina']['emailFormat']
time.sleep(5)
driver.close()

3、csv格式:

我们需要验证新浪邮箱登录时,不输入任何账号以及输入不正确格式的账号的情况下点击登录,测试他的弹窗是否符合要求,我们需要把预期结果写入到Excel文件中,然后通过保存时保存格式为.csv的格式,然后复制文件粘贴至当前项目包下

 

注意:粘贴过来的文档需要进行读取(重新创建一个同级模块存放读取文档的代码,后面继承即可)

import csv

#通过列表的方式读取
def readCsvList():
    lists=[ ]
    with open('data.csv','r',encoding='utf-8') as f:
        reader=csv.reader(f)
        #取消读取
        next(reader)
        for item in reader:
            lists.append(item[0])
    return lists

#通过字典的方式读取
def readCsvDict():
    lists=[]
    with open('data.csv','r',encoding='utf-8-sig') as f:
        reader=csv.DictReader(f)
        for item in reader:
            lists.append(dict(item))
    return lists

输出结果:

 

实际操作

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import  time
from UiAutomation.data import *

class Init(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.close()
#读取的csv文件是列表的形式的
class LoginTest(Init):
    def test_username_null(self):
        '''验证用户名为空的错误信息'''
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText = self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text, readCsvList()[0])

    def test_emile_format(self):
        '''验证用户名格式不正确的错误信息'''
        self.driver.find_element(By.ID,'freename').send_keys('werte')
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,readCsvList()[1])
#读取的csv文件是字典的形式
class LoginTest1(Init):
    def test_username_null(self):
        '''验证用户名为空的错误信息'''
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText = self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text, readCsvDict()[0]['result'])

    def test_emile_format(self):
        '''验证用户名格式不正确的错误信息'''
        self.driver.find_element(By.ID,'freename').send_keys('werte')
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,readCsvDict()[1]['result'])

if __name__ == '__main__':
    unittest.main()

4、Excel格式:

我们需要验证新浪邮箱登录时,不输入任何账号以及输入不正确格式的账号的情况下点击登录,测试他的弹窗是否符合要求,我们把预期结果写入到Excel文件中,保存后,复制文件粘贴至项目包中

读取文件:

import xlrd

'''excel格式'''
def readExcel():
    '''读取Excel文件中的内容'''
    lists=[ ]
    book=xlrd.open_workbook('data.xls')
    sheet=book.sheet_by_index(0)
    for item in range(1,sheet.nrows):
        lists.append(sheet.row_values(item)[0])
    return lists

输出结果:

 

 

 

实际操作:

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import  time
from UiAutomation.data import *

class Init(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.close()

class LoginTest(Init):
    def test_username_null(self):
        '''验证用户名为空的错误信息'''
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText = self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text, readExcel()[0])

    def test_emile_format(self):
        '''验证用户名格式不正确的错误信息'''
        self.driver.find_element(By.ID,'freename').send_keys('werte')
        self.driver.find_element(By.CLASS_NAME,'loginBtn').click()
        time.sleep(2)
        divText=self.driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,readExcel()[1])

if __name__ == '__main__':
    unittest.main()

posted @ 2022-09-16 16:41  陌上归程  阅读(84)  评论(0编辑  收藏  举报