【robotframework之六】切换到新的窗口

一、参考资料

https://www.cnblogs.com/testwang/p/6097621.html

二、切换及定位关键字

怎么切换窗口呢?首先可以F5,查看可以用到的关键字:

【robotframework之六】切换到新的窗口_第1张图片

Select Window:选择浏览器窗口匹配定位器。如果找到该窗口,所有后续命令都将使用所选窗口,直到再次使用该关键字。如果没有找到窗口,则此关键字将失败。返回前一个窗口句柄,并可用于稍后返回该句柄。

找到切换窗口的关键字后,我们要继续寻找定位窗口的关键字,同样F5,如下图:

【robotframework之六】切换到新的窗口_第2张图片

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关键字来切换窗口。

 

三、Get Window Handles切换窗口

1、打开CSDN的首页

https://www.csdn.net/

2、点击首页的登录链接,进入登录页面

 

【robotframework之六】切换到新的窗口_第3张图片

通过如上截图,我们可以看到,新开的页面没有定义ID和name,查看源文件的head,title也是一致的:

【robotframework之六】切换到新的窗口_第4张图片

所以,我们可以排除id、name和title的定位方式,使用句柄来定位。

3、通过Get Window Handles获取窗口所有句柄

首先查看一下整个登录的脚本,如下图:

 

【robotframework之六】切换到新的窗口_第5张图片

可以很明显看到,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文件,打开该文件

 

【robotframework之六】切换到新的窗口_第6张图片

可以看到,它是引用了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()

2、编辑browsermanagement.py文件

 

同样进入地址: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()))

五、根据参考地址代码扩展Selenium2Library库后依然出现的问题

 

1、在windowmanager.py和browsermanagement.py中新增方法后,重新打开robotframework,select window by handle关键字依然为黑色

解决方案:

1.1、查看browsermanagement.py文件,发现每个关键字函数前都存在@keyword,同样在每个函数前加上:

 

【robotframework之六】切换到新的窗口_第7张图片

1.2、重新ride.py打开robotframework,select window by handle关键字变为蓝色

【robotframework之六】切换到新的窗口_第8张图片

2、执行登录脚本报错,AttributeError: 'BrowserManagementKeywords' object has no attribute '_current_browser'

 

解决方案:

2.1、将_current_browser()改为drivers.current,如下图:

【robotframework之六】切换到新的窗口_第9张图片

2.2、重新打开robotframework,执行登录脚本,执行成功

六、完结

综上,登录脚本执行成功,成功定位并切换到了新的窗口,F5查看关键字,select window by handle也展示在了关键字列表

【robotframework之六】切换到新的窗口_第10张图片

具体引用方法:


${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去掉即可;

如下图:

你可能感兴趣的:(robotframework)