是的,它可以自動滾動瀏覽器,使我們與之交互的任何元素都在窗口中居中。我有以下工作示例,書面和使用硒的webdriver-2.41.0和Firefox 28
完全披露在紅寶石測試:您可能需要編輯代碼略有的部分得到這個正常工作。接下來的解釋。
Selenium::WebDriver::Mouse.class_eval do
# Since automatic centering of elements can be time-expensive, we disable
# this behavior by default and allow it to be enabled as-needed.
self.class_variable_set(:@@keep_elements_centered, false)
def self.keep_elements_centered=(enable)
self.class_variable_set(:@@keep_elements_centered, enable)
end
def self.keep_elements_centered
self.class_variable_get(:@@keep_elements_centered)
end
# Uses javascript to attempt to scroll the desired element as close to the
# center of the window as possible. Does nothing if the element is already
# more-or-less centered.
def scroll_to_center(element)
element_scrolled_center_x = element.location_once_scrolled_into_view.x + element.size.width/2
element_scrolled_center_y = element.location_once_scrolled_into_view.y + element.size.height/2
window_pos = @bridge.getWindowPosition
window_size = @bridge.getWindowSize
window_center_x = window_pos[:x] + window_size[:width]/2
window_center_y = window_pos[:y] + window_size[:height]/2
scroll_x = element_scrolled_center_x - window_center_x
scroll_y = element_scrolled_center_y - window_center_y
return if scroll_x.abs < window_size[:width]/4 && scroll_y.abs < window_size[:height]/4
@bridge.executeScript("window.scrollBy(#{scroll_x}, #{scroll_y})", "");
sleep(0.5)
end
# Create a new reference to the existing function so we can re-use it.
alias_method :base_move_to, :move_to
# After Selenium does its own mouse motion and scrolling, do ours.
def move_to(element, right_by = nil, down_by = nil)
base_move_to(element, right_by, down_by)
scroll_to_center(element) if self.class.keep_elements_centered
end
end
推薦用法:
在任何的代碼段上,其中元件是通常離屏的開始啓用自動定心,則之後將其禁用。
注意:此代碼似乎不適用於鏈式操作。例如:
driver.action.move_to(element).click.perform
滾動修復似乎不更新click
位置。在上面的例子中,它會點擊元素的預滾動位置,產生錯誤點擊。
爲什麼move_to
?
我選擇了move_to
,因爲大多數基於鼠標的操作都使用它,並且在此步驟中會出現Selenium現有的「滾動到視圖」行爲。這個特定的補丁不適用於任何在某個級別上不會調用move_to
的鼠標交互,也不期望它可以與任何鍵盤交互一起工作,但理論上,如果您包裝正確的函數,類似的方法也應該起作用。
爲什麼sleep
?
我不確定爲什麼在通過executeScript
滾動後需要sleep
命令。通過我的特殊設置,我可以刪除sleep
命令,它仍然有效。 Similar examples從other developers'網絡包括sleep
命令延遲範圍從0.1到3秒。作爲一個瘋狂的猜測,我會說這是爲了交叉兼容性的原因。
如果我不想猴子補丁怎麼辦?
正如你所建議的那樣,理想的解決方案是改變Selenium的「滾動到視圖」行爲,但我相信這種行爲是由selenium-webdriver gem以外的代碼控制的。在路徑變冷之前,我一直追溯到Bridge
。
對於猴子補丁厭惡的scroll_to_center
法正常工作,與一些換人的獨立方法,其中driver
是您Selenium::WebDriver::Driver
例如:
driver.manage.window.position
而不是 @bridge.getWindowPosition
driver.manage.window.size
,而不是 @bridge.getWindowSize
driver.execute_script
而不是 @bridge.executeScript
謝謝。這個比scrollIntoView好 – bugCracker