3.7 键盘事件实战
对于键盘事件的操作,Selenium 提供了 keys 模块中的 Keys 类来处理,导入的代码为 from selenium.webdriver.common.keys import Keys。这里以百度搜索输入框为例,在搜索输入框中输入搜索的关键字,通过 Ctrl+A 全选之后,通过 Ctrl+C 复制。按下"Backspace"键删除输入的搜索关键字,然后打开 Bing 首页,把复制的搜索关键字粘贴到 Bing 搜索输入框中,实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver import time as t from selenium.webdriver.common.keys import Keys driver=webdriver.Firefox() driver.implicitly_wait(30) driver.get('http://www.baidu.com') so=driver.find_element_by_id('kw') so.send_keys('Selenium') #选中输入框的搜索关键字 so.send_keys(Keys.CONTROL,'a') #复制搜索的关键字 so.send_keys(Keys.CONTROL,'c') #按下Backspace删除输入的搜索关键字 so.send_keys(Keys.BACKSPACE) #打开bing搜索的首页 driver.get('http://www.bing.com') bingSo=driver.find_element_by_id('sb_form_q') #复制搜索关键字到bing搜索的输入框中 bingSo.send_keys(Keys.CONTROL,'v') driver.quit() |
3.8 JavaScript 的处理
Selenium 也提供了对 JavaScript 的处理,例如,滑动到浏览器的底部或者顶端,对时间控件及对富文本等的处理,都需要 JavaScript 的脚本配合。在 Selenium 中对 JavaScript 脚本调用的方法是 execute_script,下面结合具体的实例说明这部分在自动化测试中的应用。
1.浏览器滑动操作
在自动化测试中,特别是在数据查询的页面中,由于页面内容太多,经常需要点击浏览器的底部,但往往由于看不到底部导致找不到页面元素而失败。例如,在百度搜索中,搜索后想要前往下一页,需要滑动到浏览器底部才可以找到翻页按钮,然后点击。下面就以百度搜索为例,实现滑动到浏览器的底部或者顶部,代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver import time as t driver=webdriver.Firefox() driver.implicitly_wait(30) driver.get('http://www.baidu.com') driver.find_element_by_id('kw').send_keys('Selenium') driver.find_element_by_id('su').click() #浏览器滑动到底部js代码 down="var q=document.documentElement.scrollTop=10000" t.sleep(3) #操作js实现鼠标滑动到浏览器底部 driver.execute_script(down) t.sleep(3) #点击下一页 driver.find_element_by_link_text('下一页>').click() t.sleep(3) #浏览器滑动到顶部js代码 up="var q=document.documentElement.scrollTop=0" #先滑动到底部 driver.execute_script(down) t.sleep(3) #操作js实现鼠标滑动到浏览器顶部 driver.execute_script(up) t.sleep(4) driver.quit() |
2.富文本的处理
在很多的 Web 产品中,经常存在富文本的内容,特别是要求在富文本中写入内容。对于富文本的操作不能按照常规的元素定位方式去定位。富文本一般都在 iframe 框架中,所以需要通过 iframe 的 ID 或者索引的方式进入到 iframe 中,再通过 JaveScript 的方式在富文本中输入需要的内容。例如,要想在微信公众号中编写文章,那么首先需要进入到 iframe。微信公众号富文本部分的 HTML 代码如图 3-8-1 所示。
图 3-8-1
从图 3-8-1 中可以看到,iframe 的 ID 为 ueditor_0,那么如果想要在该富文本里面写入内容,可单独写一个可调用函数,参数是编写的内容,代码如下:
def richText(content):
'''往富文本里面写入内容'''
js="document.getElementById('ueditor_0').contentWindow." \ "document.body.innerHTML='{0}'".format(content) driver.execute_script(js)
下面就以 UEditor 的富文本为例,实现在富文本中输入"Python 自动化测试实战"的文字,UEditor 要测试的页面如图 3-8-2 所示。
图 3-8-2
实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver import time as t def richText(content): '''往富文本里面写入内容''' js="document.getElementById('ueditor_0').contentWindow." \ "document.body.innerHTML='{0}'".format(content) driver.execute_script(js) driver=webdriver.Firefox() driver.implicitly_wait(30) driver.get('http://ueditor.baidu.com/website/onlinedemo.html') richText('Python自动化测试实战') t.sleep(3) driver.quit() |
3. 时间控件的处理
时间控件在测试中也是经常遇到的,特别是在查询中,需要按某一时间段查询出数据并且来验证查询功能是否正确。但是,大多数时间控件是只读属性,需要手动选择时间控件。在自动化测试中怎样自动输入时间呢?时间控件的 UI 交互如图 3-8-3 所示。
图 3-8-3
这部分的 HTML 代码如图 3-8-4 所示。
图 3-8-4
要实现在只读属性的时间控件中输入时间,步骤为:
(1)取消时间控件的只读属性。
(2)取消只读属性后,在 Input 输入框中给 Value 赋值,填写需要输入的时间,结合以上步骤,在以上时间控件中,编写开始和结束时间的可调用函数,代码如下:
def startJs(startTime): '''开始时间中输入自定义的时间''' js="$(\"input[placeholder='开始时间≥当前时间 ']\").removeAttr('readonly');" \ "$(\"input[placeholder='开始时间≥当前时间 ']\").attr('value','{0}')".format(startTime) driver.execute_script(js) def endJs(endTime): '''结束时间中输入自定义的时间''' js="$(\"input[placeholder='结束时间>开始时间 ']\").removeAttr('readonly');" \ "$(\"input[placeholder='结束时间>开始时间 ']\").attr('value','{0}')".format(endTime) driver.execute_script(js) 要想在打开该页面后,在活动时间中输入开始时间和结束时间,实现的代码如下: #!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver import time as t def startJs(startTime): '''开始时间中输入自定义的时间''' js="$(\"input[placeholder='开始时间≥当前时间 ']\").removeAttr('readonly');" \ "$(\"input[placeholder='开始时间≥当前时间 ']\").attr('value','{0}')".format(startTime) driver.execute_script(js) def endJs(endTime): '''结束时间中输入自定义的时间''' js="$(\"input[placeholder='结束时间>开始时间 ']\").removeAttr('readonly');" \ "$(\"input[placeholder='结束时间>开始时间 ']\").attr('value','{0}')".format(endTime) driver.execute_script(js) driver=webdriver.Firefox() driver.implicitly_wait(30) driver.get('file:///C:/Users/Administrator/Desktop/Time/Time/index.html') startJs('2018-01-01 00:00:00') t.sleep(3) endJs('2018-08-08 23:59:59') driver.quit() |
运行以上代码后,可看到在活动时间中实现了自定义输入开始时间和结束时间。
3.9 获取截图
在自动化测试中,在测试执行期间获取到截图信息,一方面可以定位错误的脚本,方便调试错误代码;另外一方面也可以以此为据,与开发人员进行有效的沟通。
1.获取当前截图
save_screenshot 是获取当前截图的方法。以百度首页搜索为例,要想打开百
度首页后获取百度首页的截图,实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.get('http://www.baidu.com') driver.implicitly_wait(30) driver.save_screenshot('baidu.png') driver.quit() |
代码执行后会在当前目录下生成 baidu.png 的图片。
2.保存当前屏幕快照
get_screenshot_as_file 方法可以将当前的屏幕快照保存成.png 文件,保存文件的时候可以填写完整的文件路径。依然以百度首页为例,实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.get('http://www.baidu.com') driver.implicitly_wait(30) driver.get_screenshot_as_file('c:/baidu.png') driver.quit() |
运行代码后会在 C 盘下生成 baidu.png 的图片,打开后显示的是百度的首页。
3.获取图片二进制数据
get_screenshot_as_png 方法用来获取截取图片的二进制数据。该方法在实际的测试场景中使用较少。以百度首页为例,实现的代码如下:
#!/usr/bin/env python #-*-coding:utf-8-*- #author:wuya from selenium import webdriver driver=webdriver.Firefox() driver.maximize_window() driver.get('http://www.baidu.com') driver.implicitly_wait(30) print( driver.get_screenshot_as_png()) driver.quit() |
版权声明:51Testing软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。