https://www.cnblogs.com/testwang/p/6097621.html
怎么切换窗口呢?首先可以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,写的很详细。
这篇文章中,我们使用的例子是CSDN的登录功能,其中新开的窗口的title和原有窗口的title一致,且不存在name、id等,我们可以使用Get Window Handles关键字来切换窗口。
通过如上截图,我们可以看到,新开的页面没有定义ID和name,查看源文件的head,title也是一致的:
所以,我们可以排除id、name和title的定位方式,使用句柄来定位。
首先查看一下整个登录的脚本,如下图:
可以很明显看到,select window by handle关键字为黑色,代表该关键字不存在,这里我们需要扩展Selenium2Library库,参考如下地址的资料:https://www.cnblogs.com/testwang/p/6097621.html
首先,进入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(browser) ]
def get_current_window_handle(self, browser):
return browser.get_current_window_handle()
同样进入地址:C:\Python27\Lib\site-packages\SeleniumLibrary\keywords
编辑browsermanagement.py,加上如下代码:
def select_window_by_handle(self, locator=None):
self._window_manager.select_by_handle(self._current_browser(), locator)
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._current_browser()))
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._current_browser()))
解决方案:
1.1、查看browsermanagement.py文件,发现每个关键字函数前都存在@keyword,同样在每个函数前加上:
1.2、重新ride.py打开robotframework,select window by handle关键字变为蓝色
解决方案:
2.1、将_current_browser()改为drivers.current,如下图:
2.2、重新打开robotframework,执行登录脚本,执行成功
综上,登录脚本执行成功,成功定位并切换到了新的窗口,F5查看关键字,select window by handle也展示在了关键字列表
具体引用方法:
${handles} Get Window Handles #获得句柄列表
select window by handle ${handles[1]} #根据句柄索引切换到新打开的窗口,索引从0开始,0代表原页面,1代表新打开的页面
执行之后报错,
提示: _get_window_infos() takes 1 positional argument but 2 were given;
更改 windowmanager.py文件,将self._get_window_infos(browser)中的browser去掉即可;
如下图: