Vatir: Double-click an item to open its own popup

I am new to WATIR. The problem I am facing is this - The application I am testing has thumbnails (like Windows icons) placed on the page and I need to double click on it. This will open a custom popup (ajax popup implemented in javascript). Fire_event ("ondblclick") doesn't work for me. I also tried 'click' twice, but that doesn't help either. Is there any other way to handle this? Your help is greatly appreciated.

Added 6 Jul 2010:

I solved it, but now I have another request.

Below was the HTML I was able to solve for using "@ ie.div (: class," GridElementInlineIE "). Fire_event ('ondblclick')"


<div class="gridViewItem" style='display: inline-table;' ondblclick='openAsset("634119577077187500", "", "LIBRARY_ASSETS_TAB", "1", "A111");'
        id='GridComponent634119577077187500'>
        <table style="display: inline-table;" class="gridViewItemTable" cellpadding="0" cellspacing="0"
            onclick="highlightAsset(this, event)" projectid="" dmguid="634119577077187500"
            id="_thumb_634119577077187500" objectclass="VIDEO">
            <tr>
                <td style="padding: 10px 10px 0px 7px">
                    <img class="assetListGridImage draggableThumbnail" id="thumb_634119577077187500"
                        title="A111" alt="A111"
                        src="/images/wait.gif" dmguid="634119577077187500" projectid=""
                        objectclass="VIDEO" _onclick="highlightAsset(this, event)" />
                </td>
            </tr>
            <tr>
                <td style="padding: 0px 0px 0px 7px">

                    A111
                </td>
            </tr>
            <tr>
                <td style="padding: 0px 0px 5px 7px; min-height: 33px; max-height: 33px; height: 33px;">
                    <img alt='Not starred' name='IMAGE634119577077187500' title='Star this asset' src='/Images/star_off.png' onclick='toggleStar(event, this, "634119577077187500")' class='starGrid' />
                    <img alt='video' title='video' src='/Images/asset_type/VIDEO.png'/>
                    <img src='/images/shared.png'  title ='Shared' alt='Shared' />
                </td>

            </tr>
        </table>
    </div>

      


Now I need to double click on this item (code below). But even if the item is identified (highlighted in yellow), double-clicking does not work. I am trying "@ ie.div (: class, 'gridViewItem'). Fire_event ('ondblclick')". I have also tried while and click-two loops without any effects. I am using Watir 1.6 with Ruby186-27_rc2.

           div class="GridElementInline">
                <table class="GridElementInline" style="border: solid 2px #1e606e;min-height:134px;height:134px;max-height: 134px" onclick="highlightAsset(this, event)"
                                                projectid='' folderid="2383" id="_tblBinlist2383" title = "today">
                    <tr>
                        <td style="padding: 10px 10px 0px 7px;">
                            <table id='tblBinlist2383' folderid='2383' projectId='' _onclick='highlightAsset(this, event)' ondblclick='showBinDetails("2383", "")' class='binThumbnail GridElementInline' cellpadding='0' cellspacing='0'><tr><td><img class='fourGridViewImage' src='http://stream.....' /></td><td><img class='fourGridViewImage' src='http://stream.....' /></td></tr><tr><td><img class='fourGridViewImage' src='http://stream.....' /></td><td><img class='fourGridViewImage' src='http://stream.....' /></td></tr></table>
                        </td>
                    </tr>
                <tr>
                <td colspan="2" align="center" style="padding: 10px 10px 0px 7px; font-size: 9px;white-space: nowrap;">
                <div align="left" title="today">
                    today
                </div>
                </td>
                </tr>
                </table>
            </div>

      

+2


a source to share


2 answers


There was one elegant solution for Watir 1.6.7 on Windows.

I went to ruby ​​/ lib / ruby ​​/gems/1.8/gems/watir-1.6.7/lib/watir/element.rb (your path may change, but the main idea is to access the watir library and change element .rb).

I added the following lines:



def fire_event_no_wait(event)
  assert_exists
  assert_enabled
  highlight(:set)
  element = "#{self.class}.new(#{@page_container.attach_command}, :unique_number, #  {self.unique_number})"
  ruby_code = "require 'rubygems';" <<
          "require '#{File.expand_path(File.dirname(__FILE__))}/core';" <<
          "#{element}.fire_event(\"#{event}\")"
  system(spawned_click_no_wait_command(ruby_code))
  highlight(:clear)
end

      

this will create a fire_event_no_wait method that behaves the same as click_no_wait in watir.

Hope this helps anyone.

+1


a source


EDIT You can now get a better working version of this code here .

Here's a quick and slightly messy workaround if you get really stuck with it. This allows for automatic relative clicking of the hardware to keep the problems that the click event has (and usually they do in some cases).

Stick to this in a file called "mouseControl.rb", then reference it from your main file with a "mouseControl" requirement ... or whatever you want to do. It's been a while since I've used it, but I'm sure you can hack a double click. I have not included this hack because I know this file works (or at least does). You will need to require "win32ole". When you set it up, you should just say things like @ brower.button (: text, "boo"). Left_click to do a manual click on the top level.



If you can get a more efficient answer,

require 'watir'

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 left_click
      x = left_edge_absolute + 1
      y = top_edge_absolute + 1
      #puts "x: #{x}, y: #{y}"
      WindowsInput.move_mouse(x, y)
      WindowsInput.left_click
    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
  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 left_click
    leftdown = create_mouse_input(MOUSEEVENTF_LEFTDOWN) 
    leftup = create_mouse_input(MOUSEEVENTF_LEFTUP) 
    send_input( [leftdown, leftup] )
  end

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

      

0


a source







All Articles