22
09

核心实验:Selenium WebDriver->其他应用(二)

本节实验主要为大家讲解Selenium WebDriver的另外几个比较常用的对象,它们主要包括:文件上传的操作,下拉框的使用,浏览器基本操作,对测试过程进行截图,在浏览器当前页面直接运行JavaScript脚本,等待时间等。

 实 验 简 介



本节实验主要为大家讲解Selenium WebDriver的另外几个比较常用的对象,它们主要包括:文件上传的操作,下拉框的使用,浏览器基本操作,对测试过程进行截图,在浏览器当前页面直接运行JavaScript脚本,等待时间等。




 实 验 目 的 



(1)掌握在WebDriver中通过GUI进行文件上传的操作。

(2)掌握在WebDriver中对下拉框的使用。

(3)掌握在WebDriver中对浏览器的基本操作。

(4)掌握在WebDriver中如何对测试现场进行截图保存。

(5)掌握在WebDriver中直接运行JavaScript脚本。

(6)掌握在WebDriver中如何灵活使用等待时间。



 实 验 流 程 



4.WebDriver截图


截图操作可以帮助我们截取当前正在运行的浏览器页面的现场情况。由于自动化测试脚本在执行过程中通常都是无人值守的,所以在某些异常发生的情况下,保留测试现场是非常有必要的。webdriver提供四种方式来实现截图:


(1).save_screenshot(filename)


此方法实际上是对后面方法的封装,在使用的时候非常简单,如果代码执行过程中需要截图可以直接使用driver.save_screenshot(‘xx/xx.png’)就可以。

但需要注意,如果在alert之类弹出对话框出现后来截图,程序会抛异常。


(2).get_screenshot_as_base64()


这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。比如,想把截图放到html测试报告里。

例如,s = driver.get_screenshot_as_base64(),将这种base64编码格式文件赋值给变量。方便后面使用。如图所示。


20200922_100927_118.png


(3).get_screenshot_as_file(filename)


这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。

例如:

driver. get_screenshot_as_file(‘C:/users/administrator/desktop/woniusalesfail.png’),将截图存在在系统桌面以woniusalesfail.png形式保存


(4).get_screenshot_as_png()


这个是获取屏幕截图,保存的是二进制数据

例如:s = driver.get_screenshot_as_png(),运行代码,可以发现s变量的值是二进制形式,如图所示。


20200922_100942_330.png


5.WebDriver调用JavaScript


在使用webdriver操作页面的时候经常会遇到一些前端对页面的限制,比如input标签被隐藏、或者input标签禁止输入,如图所示。


20200922_100954_770.png


前端将此文本框作了设置,不允许使用者直接填写日期,而需要手动点击弹出的日期选择框一项一项的点击,对于webdriver来说无疑是个大麻烦。查看HTML源码,可以看到此input标签中有个特殊的属性readonly,如图所示。


20200922_101001_588.png


由于此属性的存在导致input标签在自动化实现时不能通过send_key()方法来填值。既然WebDriver本身是基于浏览器内核操作的,那么它是可以直接运行JavaScript脚本。这对于我们在网页中进行的一些特殊的操作将非常有帮助。WebDriver提供execute_script()方法来执行JavaScript的代码。那么我们可以尝试通过JavaScript的方式来修改此属性的值,让该标签变为可以操作的。代码如下:

from selenium import webdriver
import time

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
driver.get('http://localhost:8080/WoniuSales/')
driver.implicitly_wait(10)

driver.find_element_by_id('username').send_keys('admin')
driver.find_element_by_id('password').send_keys('admin123')
driver.find_element_by_id('verifycode').send_keys('0000')
driver.find_element_by_xpath('//button[@onclick="doLogin(\'null\')"]').click()
driver.find_element_by_link_text('会员管理').click()
driver.execute_script("document.getElementById('childdate').readOnly=false;")
driver.find_element_by_id('childdate').clear()
driver.find_element_by_id('childdate').send_keys('11111') #避免和日期形同,验证可行性

执行代码结果如图所示。


20200922_101010_429.png


从上图可以看出,input标签不再是灰色的了,而且填入了不是标准日期格式的文本内容。但请注意,这里如果提交提交不是日期格式的内容,由于后台有验证很可能报异常。


除修改这种只读标签外,执行JavaScript的代码还有很多。比如在蜗牛进销存的商品入库模块里可以看到商品批次选项只有两个,没法添加,如图所示。


20200922_101021_812.png


如果有新批次提交,想要选择新的批次时,没有选项,那么可以通过execute_script()的方法来执行JavaScript代码实现。

driver.find_element_by_link_text(‘商品入库’)

driver.execute_script("document.getElementById('batchname').innerHTML='<option>GB20180305</option>'")

执行代码,可以发现,新的批次也出现在页面上了,如图所示。


20200922_101031_278.png


这些都是JavaScript的简单应用。当然,既然可以执行js,大家也可以用该方法来执行更复杂的功能。总之,通过调用js的方式可以完成很多webdriver本身无法完成的事情,灵活的运用这种方式,可以提高代码的编码效率,又能保证脚本的稳定性。


6.WebDriver调用下拉列表


由于下拉框可以保存很多值,甚至还会存在滚动条拖动的情况,所以我们无法使用常规的方式来对下拉框进行细致的操作。也因此在WebDriver中专门为下拉框定制了专门的对象:Select,详细使用请参考如下代码和注释:

from selenium.webdriver.support.select import Select

# 选择下拉框内容

Select(self.driver.find_element_by_id("type")).select_by_visible_text("Suggestion")

# 随机指定一个下标选择其内容

random_index = random.randint(0, 5)

Select(self.driver.find_element_by_id("type")).select_by_index(random_index)

# 随机指定一个下拉的选择的文本供随机选择

select_options = ["Requirement","Enhancement","Suggestion","Complaint","Nothing"]

random_text = select_options[random.randint(0, len(select_options)-1)]

Select(self.driver.find_element_by_id("type")).select_by_visible_text(random_text)

# 根据下拉框的Option标签的Value值选择

Select(self.driver.find_element_by_id("type")).select_by_value("Suggestion")


7.浏览器兼容性测试


兼容性测试回顾(Compatibility)。主要是为了检查软件在不同的软\硬件平台上是否可以正常的运行的一种测试。这里是为了兼容不同的浏览器。即让被测对象的主要功能在Firefox、IE、Chrome这三个主流浏览器上都能正常运行。


  • Selenium WebDriver打开不同浏览器的方式

前面已经学习到了Firefox的打开方式,直接使用driver = webdriver.Firefox()

,这是因为Firefox的WebDriver驱动直接包含在安装目录中的,只要Firefox安装时没有修改安装路径,那么我们就可以用new FirefoxDriver()直接打开。

但IE和Chrome不同,他们的安装路径中并没有驱动文件,所以我们首先要下载IE和Chrome的驱动文件IEDriverServer.exe和chromedriver.exe,这个我们课堂上会提供给大家。将这两个文件存放在任意目录。启动前设置好相关驱动的存放路径即可。


  • 实例

(1)分别创建三个文件进行测试,如图所示。


20200922_101040_479.png


(2)编写启动三个浏览器的代码,在实例化时传入相应驱动的参数即可。


IEdriverDemo.py

from selenium import webdriver

driver = webdriver.Ie(r'C:\Users\Administrator\Desktop          \

\工具\IEDriverServer.exe')
driver.get('http://www.baidu.com')


FirefoxdriverDemo.py

from selenium import webdriver

driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
driver.get('http://www.baidu.com')


ChromedriverDemo.py

from selenium import webdriver

driver= = webdriver.Chrome(r'F:\chromedriver2.21\chromedriver_win32\chromedriver.exe')
driver.get('http://www.baidu.com')


(3)运行三个脚本,在IE、FireFox、Chrome三个浏览器上分别打开了百度首页如图所示。


20200922_101050_582.png


 思 考 练 习 


完成上述练习,并总结GUI自动化测试过程中可能遇到的问题。


下次分享:核心实验:利用UISpy识别Windows界面元素



为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。

20190320_095757_834.jpg




版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/525