键盘事件实战—Python自动化测试实战(8)

发表于:2019-6-21 13:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:51Testing    来源:51Testing软件测试网原创

  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软件测试网获得电子工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号