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

修改Ruby WATIR库方法,使其稳定支持IE8浏览器的upload功能

 
阅读更多

最近在用watir作一个自动化脚本。我使用的浏览器是IE8,因为产品需要支持IE8 。由于发现ruby187+watir1.5.5 并不支持IE8的一些功能,所以升级到ruby193+watir 1.6.5。然后在我尝试用浏览器上传文件的时候,watir自带的方法还是没法很好的自动化该步。我用的是@browser.file_field(:name,"file").set($FILE_PATH)方法,会卡在如下的页面没法继续。但是用ruby187+watir1.5.5+IE6的话,用这个方法就能很稳定的通过。

 

 

所以我查找了一下watir的代码,最后发现这个file_field的set方法是定义在 D:\Ruby193\lib\ruby\gems\1.9.1\gems\watir-1.6.5\lib\watir\input_elements.rb中的。

class FileField < InputElement
    INPUT_TYPES = ["file"]
    POPUP_TITLES = ['Choose file', 'Choose File to Upload']
   
    # set the file location in the Choose file dialog in a new process
    # will raise a Watir Exception if AutoIt is not correctly installed
    def set(path_to_file)
      assert_exists
      require 'watir/windowhelper'
      WindowHelper.check_autoit_installed
  

      begin
        Thread.new do
          sleep 1 # it takes some time for popup to appear

          system %{rubyw -e '
              require "win32ole"

              @autoit = WIN32OLE.new("AutoItX3.Control")
              time    = Time.now
              while (Time.now - time) < 15 # the loop will wait up to 15 seconds for popup to appear
                #{POPUP_TITLES.inspect}.each do |popup_title|
                  next unless @autoit.WinWait(popup_title, "", 1) == 1

                  @autoit.ControlSetText(popup_title, "", "Edit1", #{path_to_file.inspect})
                  @autoit.ControlSend(popup_title, "", "Button2", "{ENTER}")
                  exit
                end # each
              end # while
          '}
   
        end.join(1)
      rescue
        raise Watir::Exception::WatirException, "Problem accessing Choose file dialog"
      end
      click
    end
  end

上面是watir 1.6.5 的代码,可以看到他是有考虑到IE8窗口title为'Choose File to Upload'的情况,IE6这个窗口的title是'Choose file'。但是运行仍然失败,可能是多线程时间上的一些原因。我尝试着做了一些修改,现在能稳定地支持IE8了,因为我只需要它支持IE8 ,所以没有考虑IE6 窗口title为'Choose file'的情况。我修改的代码如下

 class FileField < InputElement
    INPUT_TYPES = ["file"]
   
   
    # set the file location in the Choose file dialog in a new process
    # will raise a Watir Exception if AutoIt is not correctly installed
 # This method has been restore back to 187 code by Wren.  It's not 193 code.
    def set(path_to_file)
      assert_exists
      require 'watir/windowhelper'
      WindowHelper.check_autoit_installed
  

      begin
        Thread.new do
          #sleep 1 # it takes some time for popup to appear

          system %{rubyw -e '
              require "win32ole"

              @autoit = WIN32OLE.new("AutoItX3.Control")
     popup_title="Choose File to Upload" # IE 8
             
                  if @autoit.WinWait(popup_title, "", 5) == 1
                  @autoit.ControlSetText(popup_title, "", "Edit1", #{path_to_file.inspect})
                  @autoit.ControlSend(popup_title, "", "Button2", "{ENTER}")
                  end # if
               
             
          '}
   
        end.join(1)
      rescue
        raise Watir::Exception::WatirException, "Problem accessing Choose file dialog"
      end
      click
    end
  end

 

 

小结,没有研究出之前watir代码不成功的原因,只是通过尝试,试出了一种比较稳定的代码替换之。以后对线程这块还要多学习。另外,直接修改本地watir的源代码非常不妥,应该把这个方法在我的项目代码里重新定义一遍比较安全。希望能给遇到同样问题的朋友一点帮助,同时也期待专家指点一下,为何原来的那段代码会卡在我截图的页面无法前进。

 

 

2013年1月2号,追加:

关于这篇文章后来我又有了新的认识,当时我用的是watir 1.6.5 版本,对IE8的支持还不是特别稳定。现在watir最新的版本是4.0.n了,而且watir库分为watir-classic和watir-webdriver。watir-classic貌似是继承了老的watir模式,其中的这个file_field的set方法已经重构过了,而且非常稳定的支持了IE8。现在准备尝试将过去的测试脚本升级到4.0的watir-classic,目前发现比较棘手的问题是watir-classic非常不稳定,远不如1.6.5,比如点一个按钮导致页面跳转后,它不会自动等待新页面load结束,而直接运行下一句,需要自己手动添加很多等待判断才能稳定执行。还不知道为什么会这样

  • 大小: 89.4 KB
分享到:
评论

相关推荐

    ruby watir教程

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

    Watir的介绍文档:基于RUBY的web UI自动化测试库

    同时,因为Watir是Ruby库的一部分,它具有强大的编程能力,可以连接数据库、读取数据文件、导出XML、构建可重用的代码库,以及其他你能想到的各种功能。不同于一些商业工具的专有脚本语言,Watir的代码简洁、优雅且...

    ruby watir介绍文档

    Watir(Web Application Testing In Ruby)是一个用于Web应用程序测试的Ruby库。它提供了一种简单且强大的方法来模拟用户与Web页面的交互行为,进而实现Web应用的功能自动化测试。通过Watir,测试人员可以编写易于...

    ruby and watir 安装指南

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

    test_logger1.rar_Logger wat_ruby _watir_watir ruby_watir-webdriv

    Watir(Web Application Testing in Ruby)是Ruby社区开发的一个开源库,它允许我们用Ruby来编写浏览器自动化测试,支持多种主流浏览器,如Chrome、Firefox、Safari等。 标题中的“test_logger1.rar_Logger wat_...

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

    Watir,是Ruby的一个库,它允许通过编写Ruby代码来控制浏览器,进行端到端的Web应用测试。 ### Ruby安装 首先,我们需要在本地环境中安装Ruby。这可以通过Ruby安装器RVM(Ruby Version Manager)或RBEnv来完成。...

    ruby+watir自动论坛发帖

    ruby+watir技术实现的论坛发帖机器人,不完善。

    Ruby-Watir在Ruby中Web应用程序测试

    8. **异常处理**:在编写测试脚本时,要考虑到可能出现的错误情况,使用Ruby的异常处理机制(如`begin-rescue-end`)捕获并处理异常,确保测试的稳定性和可靠性。 9. **持续集成**:为了实现持续集成,你可以将...

    RUBY ON WATIR

    Ruby on Watir 是一个强大的自动化测试框架,它结合了Ruby编程语言、Watir库和Cucumber测试工具,为Web应用程序的测试提供了一种简洁而高效的方法。Ruby是一种面向对象的编程语言,以其清晰的语法和对开发者的友好性...

    ruby 自动化框架watir

    Ruby 自动化框架Watir(Web ...它的简单易用、丰富的功能以及对多种浏览器的支持,使其成为自动化测试领域中的一个优秀选择。如果你是Ruby开发者,想要提升测试效率和质量,那么学习和掌握Watir将对你的项目大有裨益。

    ruby+watir 测试框架

    Roo库支持多种文件格式,包括XLS、XLSX和CSV,使得测试人员能够方便地导入和导出测试数据。 例如,我们可以创建一个Excel文件,其中包含测试场景的详细信息,如URL、操作步骤、输入值和预期结果。然后,Ruby脚本...

    Ruby::Watir库写的答题脚本

    我用Ruby Watir库写的一个自动答题脚本,答题准确率在70%左右,学习Watir库练手之用,有兴趣的不妨看看,另外,谁有可以改进答题准确率的点子,望不吝赐教。此脚本可不是用来作弊的哦,用这个来答题,绝对通不过防...

    watir安装包之一 ruby1

    此文件太大,压缩成两个part,此为Part1 ,两个文件下载后放一起解压缩即可。 watir本地安装的安装文件共六部分,按照一~六安装即可,每一部分重要的内容在描述里面说明,如有疑问,可以留言。

    Watir1.6.5(commonwatir+firewatir+watir)+Ruby186-26

    2. **FireWatir**:作为Watir的一个扩展,FireWatir专为Firefox浏览器设计,提供了更具体的Firefox特定功能,增强了对Firefox的测试支持。 3. **Watir-Webdriver**:随着WebDriver的流行,Watir也推出了Watir-...

    Watir测试框架介绍

    Watir支持多种浏览器,包括IE、Firefox、Chrome和Safari,这使得测试环境的选择具有很高的灵活性。 ### **二、环境配置** 在开始使用Watir之前,你需要确保以下组件已安装: 1. **Ruby**: Watir是基于Ruby语言的,...

    watir&ruby测试框架

    - **Watir库**:Watir库提供了操作网页元素的方法,如点击按钮、填写表单、导航等,使得测试脚本编写直观且易于理解。 3. **框架介绍** - **Watir-Webdriver**:Watir的一个分支,使用WebDriver协议与浏览器通信...

Global site tag (gtag.js) - Google Analytics