一、参考资料,进行总结优化!
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),我们将立即处理