RobotFramework的WEB UI测试—切换到新的窗口,最新避坑

发表于:2020-12-29 10:23

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

 作者:斯潘杰    来源:博客园

  一、参考资料,进行总结优化!
  https://www.cnblogs.com/testwang/p/6097621.html
  https://blog.csdn.net/dieorlife/article/details/100150345
  二、切换及定位关键字
  怎么切换窗口呢?首先可以F5,查看可以用到的关键字:
  Select Window:选择浏览器窗口匹配定位器。如果找到该窗口,所有后续命令都将使用所选窗口,直到再次使用该关键字。如果没有找到窗口,则此关键字将失败。返回前一个窗口句柄,并可用于稍后返回该句柄。
  找到切换窗口的关键字后,我们要继续寻找定位窗口的关键字,同样F5,如下图:
 
  Get Window Handles:以列表的形式返回所有当前窗口句柄。
  Get Window Identifiers:返回并记录所有已知浏览器窗口的id属性。
  Get Window Names:返回和记录所有已知浏览器窗口的名称。
  Get Window Position:返回当前窗口的位置。
  Get Window Size:以整数形式返回当前窗口的宽度和高度。
  Get Window Titles:返回和记录所有已知浏览器窗口的标题。
  按照理论来讲,上述的关键字都可以帮助我们定位到新开的窗口,比如titles,如果新开窗口和原有窗口的title不一致时,就可以使用Get Window Titles来获取所有的标题,然后进行切换,具体可以参考以下地址:https://www.jianshu.com/p/d8b7187b5dd9,写的很详细。
  这篇文章中,我们使用的例子是金智教育的登录功能,其中新开的窗口的title和原有窗口的title不一致,不存在name、id等,我们可以使用Get Window Titles或者Get Window Handles关键字来切换窗口。
  三、下面介绍GET WINDOW HANDLES切换窗口
  1、打开金智教育的首页,此时已经登录。
  http://testdt.wisedu.com/test/sys/emaphome/portal/index.do
  2、点击搜索框,搜索教职工招聘。
  
   通过如上截图,我们可以看到,新开的页面没有定义ID和name,查看源文件的head,title是不一致的:
  
  我们可以通过title的定位方式,也可以使用句柄来定位。
  3、下面讲通过Get Window Handles获取窗口所有句柄
  首先查看一下脚本,如下图:
 
  如果select window by handle关键字为黑色,代表该关键字不存在,这里我们需要扩展Selenium2Library库,参考如下地址的资料:https://www.cnblogs.com/testwang/p/6097621.html
  四、扩展Selenium2Library库
  1、编辑windowmanager.py文件
  首先,进入Selenium2Library文件夹,我本地的地址:C:\Python27\Lib\site-packages\Selenium2Library,文件夹里面只有__init__.py文件,打开该文件
  可以看到,它是引用了SeleniumLibrary,所以我们到SeleniumLibrary文件夹找到相对应的文件进行更改即可;进入地址:C:\Python27\Lib\site-packages\SeleniumLibrary\locators,可以看到windowmanager.py文件,编辑该文件,加上如下代码:
  def select_by_handle(self, browser, toHandle):
  browser.switch_to_window(toHandle)
  def get_window_handles(self, browser):
  return [ window_info[0] for window_info in self._get_window_infos() ]
  def get_current_window_handle(self, browser):
  return browser.get_current_window_handle()
  2、编辑browsermanagement.py文件
   
  同样进入地址:C:\Python27\Lib\site-packages\SeleniumLibrary\keywords
  编辑browsermanagement.py,加上如下代码:
  @keyword
  def select_window_by_handle(self, locator=None):
  self._window_manager.select_by_handle(self.drivers.current, locator)
  @keyword
  def get_window_handles(self):
  """Returns and logs handles of all windows known to the browser."""
  return self._log_list(self._window_manager.get_window_handles(self.drivers.current))
  @keyword
  def get_current_window_handle(self):
  """Returns and logs handle of current window known to the browser."""
  return self._log_list(self._window_manager.get_current_window_handle(self.drivers.current))
  Tap:1、这里面要注意函数前面加上关键字@keyword。
     2、self.drivers.current的使用而不是使用self._current_browser()。
  五、根据参考地址代码扩展SELENIUM2LIBRARY库后依然出现的问题
  按照以上方式,运行脚本还报错:InvalidArgumentException: Message: Expected "handle" to
   selenium.common.exceptions.InvalidArgumentException: Message: Expected "handle" to be a string, got
  莫名其妙的错误,升级 geckodriver 到最新版本27。
  下载参考链接:https://www.cnblogs.com/yttbk/p/11027289.html

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理 
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号