selenium2library提供的切换到新窗口的关键字,只有select window,而且也只能根据title、name、url去定位。如下图所示,明显在实际使用中是不够的。

所以这里总结了一下其他的方法。


一、 拓展selenium2library库。

即修改selenium的源码。

1. *\ Python27\Lib\site-packages\Selenium2Library\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. *:\Python27\Lib\site-packages\Selenium2Library\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()))

二、编写自己的关键字

使用robotframework:

1. 创建“Index Item From List”关键字

Index Item From List
[Arguments] ${element} @{items}
${index}= Set Variable ${0}
: FOR ${item} IN @{items}
\ Return From Keyword If '${element}'=='${item}' ${index}
Return From Keyword ${-1}

  

2. 创建“get 新窗口”关键字

get新窗口
[Arguments] @{win_all}
@{win_all_curr} Get Window Handles
${idx}= Set Variable ${-1}
: FOR ${win} IN @{win_all_curr}
\ ${idx} Index Item From List ${win} @{win_all}
\ Return From Keyword If ${idx} == ${-1} ${win}
\ Comment Should be True 0 == 1 #No win handle or no new handle
Should Be True ${idx} msg=No Window handles or no new handle

3. 创建“select新窗口/原窗口”关键字

[Arguments]    ${keyword}    ${item}
${win_curr}= Get Current Window Handle
@{win_hds}= Get Window Handles
Run Keyword ${keyword} ${item}
sleep 3
${win_child}= get新窗口 @{win_hds}
Select Window By Handle ${win_child}
[Return] ${win_child} # ${win_curr} |也可以返回这个,就是返回原窗口

  

4. 使用我们写好的关键字吧。

看上面3个关键字,可能有些人会不是很懂,不是很理解到底怎么切换的,所以这里写个调用的方法,方便理解。

102002-随机打开箱包宝贝
click element css=li>a[href='#/list/?category1=热卖箱包']
sleep 3
@{items} Get Webelements css=.item_picture>a[href]
${item}= 随机选择元素赋值 @{items}
select新窗口 click element ${item}

  例子说明:1. 先是打开了一个箱包的新窗口;

2. 第3、4行代码都是随机获得一个href的链接。

3. 最后一行,就是调用我们的“select新窗口”来切换到新打开的“href”的窗口。

里面的逻辑,把代码带入看,

 select新窗口    click element    ${item}带入看

${win_curr}= Get Current Window Handle #获得当前窗口
    @{win_hds}= Get Window Handles    #获得当前所有的窗口
    Run Keyword  click element ${item}  #带入后,这里就是打开我们的href新窗口
    sleep 3
    ${win_child}= get新窗口 @{win_hds} #get新窗口会获取打开href新窗口后的所有窗口,会比@{win_hds}多这么一个href。这样就可以循环得到它了。
    Select Window By Handle ${win_child}
    [Return] ${win_child}

本章大致结束,后面有新的更好的,回慢慢补充。

    

robotframwork的WEB功能测试(一)—切换window窗口的更多相关文章

  1. 使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中

    原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between- ...

  2. robotframwork的WEB功能测试(二)—登录

    小结一下截止到目前,我接触的系统的登录模拟. 1. 带token的session:这种用抓包工具很容易抓到,使用这个链接就可以模拟已登录. 2. 使用cookie:有的系统是判断cookie来判断是否 ...

  3. web自动化之浏览器的窗口切换

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  4. Window 窗口类

    窗口类 WNDCLASS 总结 总结为下面的几个问题: . 什么是窗口类 . 窗口类的三种类型 . 窗口类各字段含义 . 窗口类的注册和注销 . 如何使用窗口类,子类化.超类化是什么 下面分别描述: ...

  5. 【转载】Window 窗口层次关系

    相信在Window 下面编程的很多兄弟们都不是很清楚Window 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下.下面就说说Window ...

  6. [转载]ExtJs4 笔记(9) Ext.Panel 面板控件、 Ext.window.Window 窗口控件、 Ext.container.Viewport 布局控件

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  7. JavaScript:window窗口对象

    在JavaScript中,window表示的就是一个窗口对象.所以在整个处理过程之中,所有的操作都是以弹框为主 的.范例1:使用警告框 <script type="text/javas ...

  8. (转载)JavaScript中的Window窗口对象

    (转载)http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 例子: <html> <head> < ...

  9. iOS切换window根控制器 (转)

    转自linfengwenyou 在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器) 方法一: 1. appdelegate.m中 self.window = [[UIWin ...

随机推荐

  1. C#学习笔记-原型模式

    题目:编写基本的简历. 实现: 创建基本的Resume类,然后主函数通过实例化Resume来写简历即可. Resume类: class Resume { private string name; pr ...

  2. js 中concat()和slice()方法介绍

    1.concat() concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. <script type="text/javascr ...

  3. 关于beginPath()和closePath()的关系>>canvas的beginPath和closePath分析总结,包括多段弧的情况

    今天查了一下beginPath()和closePath()关于区域的划分问题,发现到一篇解释得很明白的文章,我就直接转载到这里了. 原文请看:canvas的beginPath和closePath分析总 ...

  4. Drupal7安装注意事项

    1.在php.ini中将max_execution_time = 2400,memory_limit = 256M

  5. float浮动

    float是什么意思?float是浮动,翻译成中文也是浮动意思.进入对应css手册中float手册了解float基本信息. Float常跟属性值left.right.none Float:none 不 ...

  6. CentOS网卡显示为__tmpxxxxxxxx

    一台服务器做了2组端口绑定(bonding),其中一组bond总是不成功,发现少了eth0/eth5 两个网卡,后来通过ifconfig -a 发现多了两个__tmpxxx的网卡 ifconfig - ...

  7. flask多线程多协程操作

    local的作用:各个线程各开辟一块空间互不影响 基于local""" import threading from threading import local impo ...

  8. mac自动生成路径问题

    使用myBatis的逆向工程,一直无法生成.最后找同事帮忙,最终发现是 :路径前面少加一个反斜杠... 也就是 mac的绝对路径 前面需要加上 反斜杠.

  9. maven项目在idea下右键不出现maven的解决办法

    重新删除项目,导出 再重新引入.

  10. GitHub初步探索-1-使用本地代码管理工具,简化上传的过程

    使用GitHub对于我们写Java的同志们来说是一个非常好的代码存储的方式,但是因为是全英文的,操作起来有一点复杂,所以我不是经常使用 ,但是最近代码越敲越多,再加上老师要求,希望使用比较简单的方法来 ...