齐逢有李

导航

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

一、参考资料,进行总结优化!
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))

Tap1、这里面要注意函数前面加上关键字@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

 

posted on 2020-12-03 14:35  斯潘杰  阅读(333)  评论(0)    收藏  举报