`
piecehealth
  • 浏览: 47958 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

代替Watir中click_no_wait的方法。

阅读更多
我在刚学watir的时候被js弹出对话框折腾的死去活来,如何处理弹出框的方法网络上一搜一大堆,但是如何点出弹出框的文章却很少。因为如果用click或者click!方法点击会阻塞脚本,不能让脚本执行下去,而click_no_wait方法又不稳定(用ruby186-27_rc2.exe安装的ruby click_no_wait方法根本就不好用),当时差点让我对watir失去了信心。
还好在watir群里(群号25656482)的一位朋友给我提供了另一个替代click_no_wait的方法。
首先建一个ruby文件(我把它命名为ClickHelper.rb),把下面代码考进去。
#File Name: ClickHelper.rb
require 'watir'
require 'Win32API'
module Watir
  class Element
    def top_edge
      assert_exists
      assert_enabled
      ole_object.getBoundingClientRect.top.to_i
    end

    def top_edge_absolute
      top_edge + page_container.document.parentWindow.screenTop.to_i
    end

    def left_edge
      assert_exists
      assert_enabled
      ole_object.getBoundingClientRect.left.to_i
    end

    def left_edge_absolute
      left_edge + page_container.document.parentWindow.screenLeft.to_i
    end

    def right_click
      x = left_edge_absolute
      y = top_edge_absolute
      #puts "x: #{x}, y: #{y}"
      WindowsInput.move_mouse(x, y)
      WindowsInput.right_click
    end

    def left_click
      x = left_edge_absolute
      y = top_edge_absolute
      #puts "x: #{x}, y: #{y}"
      # need some extra push to get the cursor in the right area
      WindowsInput.move_mouse(x + 2, y + 2)
      WindowsInput.left_click
    end
  end
end

module WindowsInput
  # Windows API functions
  SetCursorPos = Win32API.new('user32','SetCursorPos', 'II', 'I')
  SendInput = Win32API.new('user32','SendInput', 'IPI', 'I')
  # Windows API constants
  INPUT_MOUSE = 0
  MOUSEEVENTF_LEFTDOWN = 0x0002
  MOUSEEVENTF_LEFTUP = 0x0004
  MOUSEEVENTF_RIGHTDOWN = 0x0008
  MOUSEEVENTF_RIGHTUP = 0x0010

  module_function

  def send_input(inputs)
    n = inputs.size
    ptr = inputs.collect {|i| i.to_s}.join # flatten arrays into single string
    SendInput.call(n, ptr, inputs[0].size)
  end

  def create_mouse_input(mouse_flag)
    mi = Array.new(7, 0)
    mi[0] = INPUT_MOUSE
    mi[4] = mouse_flag
    mi.pack('LLLLLLL') # Pack array into a binary sequence usable to SendInput
  end

  def move_mouse(x, y)
    SetCursorPos.call(x, y)
  end

  def right_click
    rightdown = create_mouse_input(MOUSEEVENTF_RIGHTDOWN)
    rightup = create_mouse_input(MOUSEEVENTF_RIGHTUP)
    send_input( [rightdown, rightup] )
  end

  def left_click
    leftdown = create_mouse_input(MOUSEEVENTF_LEFTDOWN)
    leftup = create_mouse_input(MOUSEEVENTF_LEFTUP)
    send_input( [leftdown, leftup] )
  end
end


这段代码是给watir添加了几个方法(主角Watir模块的left_click方法),其原理就是通过DOM计算出控件的位置,然后再利用Windows的API在那个计算好的坐标模拟一下鼠标点击(left_click是左击,right_click是右击,我好像是在说废话)。

好了我们来测试一下,先建立一个测试用的网页,html代码如下。
<html>
<head>
<script>
function click_me()
{
	alert("乖");
}
</script>
<title>test page</title>
</head>
<body>
<input id='btnClickMe' type = 'button' value = 'Click Me!' onclick='click_me()'/>
</body>
</html>

只有一个按钮,点击之后会弹出一个对话框。那我们现在写测试脚本。
require 'watir'
require 'ClickHelper'

ie = Watir::IE.attach(:title, "test page")
ie.button(:id, 'btnClickMe').click
#ie.button(:id, 'btnClickMe').click!
#ie.button(:id, 'btnClickMe').click_no_wait
#ie.button(:id, 'btnClickMe').left_click
puts "Successful"
# Deal with the pop up window.


分别使用四种方法点击button,结果:
click, click!方法都会弹出对话框,但是脚本会停止执行下面的步骤,也就是说不会输出"Successful",甚至脚本会永远卡在那里。
click_no_wait可以输出"Successful",但是不会弹出对话框(这个方法与ruby,watir的版本有关,相信很多人会遇到跟我一样的问题)。
left_click可以弹出对话框,也可以输出"Successful",正是我们想要的效果。

问题貌似要解决了,但是前几天我发现了left_click的一个缺陷,那就是当按钮不在屏幕中显示时按钮就按不到了。
我把一开始的html测试页代码改了一下,增加了点文字,然后把窗口缩放一下,弄成下图的样子。

此时按钮还在页面中,但是再用left_click方法就点不到了

但是遇到问题还是要解决的。这时候我想起当我们往文本框输入的时候,页面会自动将文本框调整到浏览器的屏幕中,那么如果按钮也能自动调整进来,那么就可以继续使用left_click了。
于是我查看text_field的set的源代码。在这里插一句,在cmd中输入gem server后,在浏览器地址栏里输127.0.0.1:8808就可以直接查看你已经安装的gem包的api了,非常方便(不要用IE,IE的显示有问题)。
当我看到text_field的set方法的代码时发现他要先执行一个focus的操作。

于是在自己测试脚本上也加上这一句。
require 'watir'
require 'ClickHelper'

ie = Watir::IE.attach(:title, "test page")
ie.button(:id, 'btnClickMe').focus
ie.button(:id, 'btnClickMe').left_click
puts "Successful"
# Deal with the pop up window.

这下果真成功了!脚本会先把按钮调整到屏幕中,然后再点击

好了,问题已经解决了,剩下的就是优化一下,把focus封装到left_click里面,这样以后就不用自己写focus了。
观察了一下,在Element类的left_edge方法中添加一句话。
    def left_edge
      assert_exists
      assert_enabled
      ole_object.focus  # 这句话是我加的
      ole_object.getBoundingClientRect.left.to_i
    end

为了保证脚本的健壮性,必须保证每次用left_click时被操作的控件都在最前。还好watir有一个方法专门干这件事,那就是bring_to_front。
还是在left_edge里加。
    def left_edge
      assert_exists
      assert_enabled
      page_container.bring_to_front      # 这句话是我加的
      ole_object.focus                        # 这句话也是我加的
      ole_object.getBoundingClientRect.left.to_i
    end

大功告成。附修改过后的脚本,嫌麻烦的直接用吧。
  • 大小: 53.7 KB
  • 大小: 68.6 KB
3
0
分享到:
评论

相关推荐

    test_logger1.rar_Logger wat_ruby _watir_watir ruby_watir-webdriv

    标题中的“test_logger1.rar_Logger wat_ruby _watir_watir ruby_watir-webdriver”揭示了这个压缩包文件的内容。首先,“test_logger1”可能是一个测试项目或者测试脚本的名称,而“Logger”则指的是Ruby内置的日志...

    watir语法详解和描述

    这些方法都是Watir库提供的基础操作,使得测试人员能够编写出高度定制化的测试脚本,有效地自动化网页测试流程。在实际应用中,可能还需要结合其他Ruby库和工具,如Selenium WebDriver,以实现更复杂的浏览器自动化...

    watir-cn中文补丁包

    watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn中文语言包 watir-cn...

    watir api chm

    Watir提供了多种方法来查找和操作页面元素,例如`browser.text_field(name: 'username')`用于找到指定name属性的文本框,`element.click`用于点击元素,`element.value = 'new value'`用于更改元素的值。...

    Watir测试框架介绍

    3. **Watir库**: 在Ruby环境中,使用`gem install watir`命令安装Watir库。 4. **其他依赖库**: 根据你的需求,可能还需要安装其他的辅助库,如`rspec`用于编写规范化的测试代码。 ### **三、API介绍** Watir提供了...

    watir测试框架介绍

    watir测试框架介绍 watir测试框架介绍 watir测试框架介绍

    watir简易教程

    在开始使用Watir之前,你需要在脚本中引入库,通过`require 'watir'`来加载Watir模块。然后,你可以创建一个浏览器实例,例如创建一个新的Internet Explorer(IE)浏览器,通过`Watir::IE.new`或`Watir::IE.start('...

    watir安装包之三 IE watir

    安装命令:gem install watir --local。

    自动化测试Watir参考手册

    - **Watir+XPath**: XPath是一种用于定位XML文档中元素的语言,结合使用可以更精确地定位页面元素。 - **Watir框架、扩展、工具**: 介绍了一些常用的扩展库和工具,如数据驱动、关键字驱动等。 - **数据驱动**: 数据...

    ruby and watir 安装指南

    ### Ruby 和 Watir 的安装指南 #### 背景与问题描述 在尝试安装 Watir 时遇到问题,尤其是在服务器 2003 上。主要问题是 Watir 的依赖包 `activesupport` 需要 Ruby 版本 &gt;= 1.8.7,而当前系统上安装的是 Ruby ...

    watir安装所需要的gem包

    - 使用Watir提供的各种方法进行页面元素的操作,如`click`、`text`、`value`等。 - 考虑使用Page Object模式来组织测试代码,提高可维护性和可读性。 - 对于大型项目,可以结合Cucumber或RSpec等BDD工具,以更高...

    watir-1.5.2.gem

    开源自动化测试工具组合:Ruby+Watir安装 安装准备: 1. 工具安装包准备: Ruby官方下载地址:http://www.ruby-lang.org/zh_cn/downloads/,稳定版本Ruby 1.8.6 Watir下载地址:...

    watir-1.6.5.gem

    开源自动化测试工具组合:Ruby+Watir安装 安装准备: 1. 工具安装包准备: Ruby官方下载地址:http://www.ruby-lang.org/zh_cn/downloads/,稳定版本Ruby 1.8.6 Watir下载地址:...

    watir介绍及安装

    此外,Ruby的交互式命令工具IRB(Interactive Ruby Shell)在Watir开发中起到了重要作用,它允许测试人员逐行执行代码进行调试,快速定位和解决问题。Ruby的Test::Unit单元测试框架也提供了灵活的测试用例管理和断言...

    ruby watir教程

    **Ruby Watir** 是一种用于网页自动化测试的工具库,它能够模拟用户在浏览器中的操作行为,如点击按钮、填写表单等,非常适合进行功能测试、回归测试和系统测试。 #### 二、安装Ruby Watir ##### 1. 安装Ruby环境 ...

    开放Ruby+watir 自动化测试工具介绍+安装说明

    4. **操作方法**:Watir提供了丰富的操作方法,如`click`(点击)、`text`(获取元素文本)、`set`(输入文本)等。 ### 示例代码 下面是一个简单的Watir测试脚本示例,它打开一个网页,查找并点击一个按钮: ```...

    WATIR-WEBDRIVER自动化学习指导

    ie.sikuli_image(:image=&gt;"1.png").double_click ``` 此方法可以用来模拟鼠标双击事件。 ##### 6. 右键单击(right_click) ```ruby ie.sikuli_image(:image=&gt;"1.png").right_click ``` 该操作模拟鼠标右键单击。 #...

Global site tag (gtag.js) - Google Analytics