Selenium - 使用Firefox的MoveTargetOutOfBoundsException

时间:2017-06-27 09:42:25

标签: python python-2.7 selenium firefox selenium-webdriver

我对 Firefox Webdriver上的功能 move_to_element 有疑问(Chrome,IE效果很好)

driver = webdriver.Firefox()
driver.get("https://stackoverflow.com")
time.sleep(5)
source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
ActionChains(driver).move_to_element(source_element).perform()

我正在使用这些版本:geckodriver - 0.17.0 // Firefox - 54.0 // selenium - 3.4.3

运行此脚本后,输出显示:

selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (134.96666717529297, 8682.183013916016) is out of bounds of viewport width (1268) and height (854) 

8 个答案:

答案 0 :(得分:4)

我认为这里的正确答案很幸运,因为他们正在寻找的元素恰好在页面底部,并且并没有真正解释为什么这种现象通常在Firefox中发生。

除Firefox之外的浏览器都将Webdrivers move_to_element操作视为滚动到带有元素的页面部分,然后将其悬停在其上。 Firefox似乎已经hardline stance认为move_to_element只是悬停,正在等待scroll的操作来解决此问题。

现在,您必须使用上一个答案中提到的javascript解决此错误,但是我建议使用类似的方法而不是任意(嗯,我想这个示例是页脚)滚动到页面底部并且希望对象仍在视图。

    def scroll_shim(passed_in_driver, object):
        x = object.location['x']
        y = object.location['y']
        scroll_by_coord = 'window.scrollTo(%s,%s);' % (
            x,
            y
        )
        scroll_nav_out_of_way = 'window.scrollBy(0, -120);'
        passed_in_driver.execute_script(scroll_by_coord)
        passed_in_driver.execute_script(scroll_nav_out_of_way)

然后再

source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
if 'firefox' in driver.capabilities['browserName']:
    scroll_shim(driver, source_element)
# scroll_shim is just scrolling it into view, you still need to hover over it to click using an action chain.
actions = ActionChains(driver)
actions.move_to_element(source_element)
actions.click()
actions.perform()

答案 1 :(得分:2)

以下是您的问题的答案:

您看到的错误将其全部显示为selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: (134.96666717529297, 8682.183013916016) is out of bounds of Viewport width (1268) and height (854)。您要查找的元素不在Viewport范围内。我们需要向下滚动才能将元素放在Viewport中。这是工作代码:

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains

binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe')
caps = DesiredCapabilities().FIREFOX
caps["marionette"] = True
driver = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")
driver.get("https://stackoverflow.com")
last_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
source_element = driver.find_element_by_xpath('//*[@id="footer"]/div/ul/li[1]/a')
ActionChains(driver).move_to_element(source_element).perform()

如果这回答你的问题,请告诉我。

答案 2 :(得分:1)

您可以在以下情况下尝试在Firefox中自动执行脚本,该脚本通常会引发MoveTargetOutOfBoundsException错误:

一个人可以通过以下方式进行变形/放大或缩小

driver.execute_script("document.body.style.transform='scale(0.9)';")

有时,如果您在Jenkins(CI工具)中运行自动化脚本,则可能还会遇到上述转换代码中的问题,即转换为浏览器的内容而不是实际的浏览器,在这种情况下,您可以尝试调整浏览器的大小窗口:

driver.set_window_size(x, y)

driver.set_window_size(2000, 694)

答案 3 :(得分:0)

尝试在Driver.get()

之前将窗口大小设置为驱动程序
driver.set_window_size(1024, 768) #(1920, 1080) #(4096, 3112)

答案 4 :(得分:0)

这对我有用:

    WebElement element = driver.findElement(By.id("id")));
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    Thread.sleep(500); 
    Actions act = new Actions(driver);
    act.moveToElement(element).perform();

答案 5 :(得分:0)

time.sleep()命令有时可以在元素需要花费时间来切换时使用。滚动始终对您没有帮助。

答案 6 :(得分:0)

这不是通用解决方案,但可能会帮助您敲响警钟。 多亏了此线程中的输入,我可以通过调整目标页面来解决此问题。

就我而言,例外发生了:

  • 在检查是否存在恰好位于页面顶部的元素时,
  • 由于在页面底部的按钮元素上设置了“自动对焦”,因此页面在浏览器上呈现时正自动滚动到底部。

由于测试脚本是针对我自己的开发的,因此我可以灵活地查看对“自动对焦”的需求,并避免在呈现页面时自动滚动到页面底部。

或者,如果可行,检查在视口中呈现的其他元素是否存在也可以解决问题。

答案 7 :(得分:-3)

最近2个小时我一直在寻找解决方案,但没有任何反应。然后,在打开要执行操作的窗口并开始工作之后,我给了time.sleep(5)个睡眠时间。