一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“API:操作API(四)”。
(16)执行Javascript代码&对HTML5 canvas的操作。
Selenium可以用过execute_script(Java_Script)方法执行Javascript代码,语句则为参数Java_Script。canvas也是HTML5的一个亮点,Selenium对canvas操作其实就是执行一段javascript语句。
案例4-71:HTML5 canvas的操作。
简单起见,在这里使用w3school的画布进行操作,代码如下。
def test_CheckCanvas (self):
self.driver.execute_script("var c=document.getElementById('myCanvas');"
"var cxt=c.getContext('2d');"
"cxt.fillStyle='#FF0000';"
"cxt.fillRect(0,0,150,50);")
time.sleep(3)
self.driver.save_screenshot("./HTMLCanvas.png")
运行这段代码产生的截图如图4-34所示。
图4-34 HTML5 canvas的操作后的截图
(17)Selenium Grid。
如果测试用例非常多的时候,往往在一台机器上运行会消耗很多时间,Selenium提供的Grid技术,如图4-35所示。
图4-35 HTML5 Selenium Grid
Selenium Grid是一个HUB-NODE接口,需要测试的代码都在HUB节点上,通过HUB的管理,所有Selenium测试程序被随机分配到Node节点上进行运行。
为了能够运行Selenium Grid,需要作如下的配置。
l hub端与node端都能下载selenium-server-standalone-3.9.1.jar放在本地目录中,比如C:\Lib\下。
l 下载selenium-3.X driver。
l 在hub端启动hub节点(注意hub的4444端口必须是空闲的)。
C:\>java -jar path\selenium-server-standalone-3.9.1.jar -role hub
其中path为存放selenium-server-standalone-3.9.1.jar的目录,下同。
l 在node端向hub端进行注册(注意node的5566端口是空闲的,否则重新在命令中分配)。
C:\>java -jar path\selenium-server-standalone-3.9.1.jar -role node -port 5566 -hub http://:4444/grid/register
其中是Hub端的IP地址。
l 在Hub端打开浏览器,地址栏中输入:http://localhost:4444/grid/console,出现如图4-36界面。
图4-36 注册了Node的Hub浏览器界面
由图4-36可以看见,默认情况下Node端注册了5个Firefox浏览器、1个IE浏览器和5个Chrome浏览器。也可以通过以下命令注册你想要的浏览器个数。
注册5个IE浏览器
C:\>java -jar path\selenium-server-standalone-3.9.1.jar -role node -hub http:// :4444/grid/register -port 5566 -maxSession 5 -browser browserName="internet explorer",maxInstances=5
注册5个chrom浏览器
C:\>java -jar path\selenium-server-standalone-3.9.1.jar -role node -hub http:// :4444/grid/register -port 5566 -maxSession 5 -browser browserName="chrome",maxInstances=5
注册5个fixfox浏览器
C:\>java -jar path\selenium-server-standalone-3.4.0.jar -role node -hub http:// :4444/grid/register -port 5566 -maxSession 5 -browser browserName="fixfox",maxInstances=5
如果IE浏览器、chrom浏览器和fixfox浏览器的驱动分别在C:\Lib_ie\、C:\Lib_chrome\和C:\Lib_firefox\目录下,可以用如下命令进行注册。
C:\>java -Dwebdriver.ie.driver="C:\Lib_ie\IEDriverServer.exe" -Dwebdriver.chrome.driver="C:\Lib_chrome \chromedriver.exe" -Dwebdriver.firefox.driver="C:\Lib_firefox\geckodriver.exe" -jar path \selenium-server-standalone-3.9.1.jar -role node -hub http://:4444/grid/register -port 5566
另外在Node上要进行如图4-37设置,点亮“允许活动内容在‘我的电脑’上运行”选项。
图4-37 Selenium Grid Node上Internet设置
案例4-72:Selenium Grid。
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import unittest,time
class grid(unittest.TestCase):
def setUp(self):
#CHROME浏览器
capabilities = DesiredCapabilities.CHROME
#微软浏览器
#capabilities = DesiredCapabilities.INTERNETEXPLORER
#FIREFOX浏览器
#capabilities = DesiredCapabilities.FIREFOX
self.driver = webdriver.Remote(command_executor="http://10.10.7.238:4444/wd/hub",desired_capabilities=capabilities)# 10.10.7.238为本地Hub端的IP地址
"""
如果grid的hub可以接收到消息,但是测试不成功,则可以使用本地方法来调试。
如driver = webdriver.Ie()来进行本地测试,"""
#self.driver = webdriver.Ie()
self.driver.implicitly_wait(3)
self.driver.get("https://www.baidu.com")
def test_grid(self):
self.driver.find_element_by_id("kw").send_keys("大数据")
self.driver.find_element_by_id("su").click()
time.sleep(5)
self.assertEqual(self.driver.title,"大数据_百度搜索",msg="Title is not right")
def tearDown(self):
self.driver.quit()
其中。
l capabilities = DesiredCapabilities.CHROME:表示在CHROME浏览器中运行。
l capabilities = DesiredCapabilities.INTERNETEXPLORER:表示在微软浏览器中运行。
l capabilities = DesiredCapabilities.FIREFOX:表示在FIREFOX浏览器中运行。
Selenium Grid测试程序在Hub端启动,将会被随机平均分配到各个Node端运行。
(18)数据化驱动。
通过Python读取xml、excel文件、数据库可以对Selenium进行数据驱动操作。
案例4-73:XML文件的数据驱动。
定义以下config.xml文件,文件中定义了所用浏览器类型,一组定义了百度查询关键字数据。
chrome
软件测试
大数据
软件工程
云计算
其测试代码如下。
from selenium import webdriver
import unittest,time
from xml.dom import minidom
from util import drivers,findby
class checkbaidu(unittest.TestCase):
def setUp(self):
d = drivers()
self.driver=d.driver
self.driver.implicitly_wait(5)
def test_CheckBaidu(self):
dom = minidom.parse('config.xml')
root = dom.documentElement
words = root.getElementsByTagName('words')
i=0
for word in words:
self.driver.get("https://www.baidu.com")
inputstring=words[i].firstChild.data
self.driver.clear(self.driver.find_element_by_id("kw"))
self.driver.send_keys(self.fd.find_element_by_id("kw"),inputstring)
self.driver.click(self.driver.find_element_by_id("su"))
time.sleep(3)
self.assertEqual(self.driver.title,inputstring+"_百度搜索",msg="标题错误")
i=i+1
def tearDown(self):
self.fd.quit(self.driver)
if __name__=="__main__":
unittest.main()
案例4-74:Excel文件的数据驱动。
建立Excel文件:config.xlsx。在这个文件中第一个sheet中书写测试所用的浏览器类型(为方便起见,从第一行第一列开始书写),如图4-38所示。第二个sheet中为测试数据,定义了百度查询关键字数据,如图4-39所示。
图4-38第一sheet中定义测试所用的浏览器类型
图4-39 第二个sheet中为测试数据
测试代码如下。
#coding=utf8
# 导入xlrd模块
import xlrd
from xlutils.copy import copy
import unittest
from selenium import webdriver
import unittest,time
from xml.dom import minidom
from util import drivers,findby
class checkbug2report(unittest.TestCase):
def setUp(self):
#设置文件名和路径
fname = 'config.xlsx'
# 打开文件
filename = xlrd.open_workbook(fname)
#获取当前文档的表(得到的是sheet的个数,一个整数)
self.sheets=filename.nsheets
self.sheet1 = filename.sheets()[0]#获得sheet1
self.sheet2 = filename.sheets()[1]#获得sheet2
# print sheet
self.nrows1 = self.sheet1.nrows#获得sheet1的行数
self.nrows2 = self.sheet2.nrows#获得sheet2的行数
d = drivers()
self.driver=d.driver
self.driver.implicitly_wait(5)
def test_baidu(self):
for i in range(0,self.nrows1):#读取sheet1中的数据
row_datas = self.sheet1.row_values(i)
browser = row_datas[0]
for i in range(0,self.nrows2): #循环读取sheet2中的数据
row_datas = self.sheet2.row_values(i)
inputstring = row_datas[0]
self.driver.get("https://www.baidu.com")
self.driver.clear(self.driver.find_element_by_id("kw"))
self.driver.send_keys(self.driver.find_element_by_id("kw"),inputstring)
self.driver.click(self.driver.find_element_by_id("su"))
time.sleep(3)
self.assertEqual(title,inputstring+"_百度搜索",msg="标题错误")
def tearDown(self):
self.driver.quit()
if __name__=="__main__":
unittest.main()
断言API
由于这里采用的是unittest,所以直接使用unittest的断言函数。读者可以考虑如何采用Pytest框架来实现。