Watir: нужно дважды щелкнуть элемент, чтобы открыть пользовательское всплывающее окно - PullRequest
2 голосов
/ 29 апреля 2010

Я новичок в ВАТИР. Проблема, с которой я сталкиваюсь, - В тестируемом приложении на странице размещены эскизы (например, значки Windows), и мне нужно дважды щелкнуть по нему. После этого откроется пользовательское всплывающее окно (ajax popup, реализованное в javascript). Fire_event ("ondblclick") не работает для меня. Я также дважды попробовал «щелкнуть», но это тоже не помогает. Есть ли другой способ справиться с этим? Ваша помощь высоко ценится.

Добавлено 6 июля 2010 г .:

Я решил, но теперь у меня есть другой запрос.

Ниже приведен HTML-код, который я смог решить с помощью "@ 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>

Теперь мне нужно дважды щелкнуть по этому пункту (код ниже). Но даже если элемент идентифицирован (выделен желтым цветом), двойной щелчок не работает. Я пытаюсь "@ ie.div (: class, 'gridViewItem'). Fire_event ('ondblclick')". Я также пробовал циклы while и варианты двойного щелчка, но безрезультатно. Я использую Watir 1.6 с 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 ]

1 голос
/ 16 апреля 2011

Есть одно элегантное решение, которое я сделал для Watir 1.6.7 в Windows.

Я пошел в ruby ​​/ lib / ruby ​​/ gems / 1.8 / gems / watir-1.6.7 / lib / watir / element.rb (ваш путь может измениться, но основная идея - получить доступ к библиотеке watir и изменить файл element.rb).

Я добавил эти строки:

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

это создаст метод с именем fire_event_no_wait, который ведет себя так же, как click_no_wait в watir.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 12 июля 2010

РЕДАКТИРОВАТЬ Вы можете получить лучшую рабочую версию этого кода здесь сейчас.

Вот быстрый и немного грязный обходной путь, если вы действительно застряли с этим. Это обеспечивает автоматическое относительное аппаратное нажатие, чтобы сохранить проблемы, возникающие в событии щелчка (и в некоторых случаях оно имеет место).

Вставьте это в файл с именем, скажем, "mouseControl.rb", затем создайте ссылку на него из вашего основного файла с помощью require 'mouseControl' ... или как вы хотите это сделать. Прошло много времени с тех пор, как я использовал его, но я уверен, что вы можете взломать его двойным щелчком. Я не включил указанный хак, потому что я знаю, что этот файл работает (или, по крайней мере, работал). Вам нужно будет потребовать «win32ole». Когда вы его настроите, вы сможете просто сказать что-то вроде @ brower.button (: text, "boo"). Left_click, чтобы выполнить аппаратный щелчок верхнего уровня вручную.

Должен привести вас в порядок, пока вы не получите лучший ответ.

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
...