РЕДАКТИРОВАТЬ Вы можете получить лучшую рабочую версию этого кода здесь сейчас.
Вот быстрый и немного грязный обходной путь, если вы действительно застряли с этим. Это обеспечивает автоматическое относительное аппаратное нажатие, чтобы сохранить проблемы, возникающие в событии щелчка (и в некоторых случаях оно имеет место).
Вставьте это в файл с именем, скажем, "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