在 CentOS 7 上使用 Selenium,在我的 CentOS 7 上获得 MoveTargetOutOfBoundsException,当脚本在 Mac OS 上 运行 Big 时不会发生苏尔

With Selenium on CentOS 7, getting a MoveTargetOutOfBoundsException on my CentOS 7, which doesn't occur when the script is run on Mac OS Big Sur

我正在使用带有最新 Selenium 的 Python 3.9 并拥有此代码,运行 在我的 Mac、Chrome 驱动程序 101 无头实例上很好 运行我的脚本 ...

  element = self.driver.find_element(By.CSS_SELECTOR, "body")
  actions = ActionChains(self.driver)
  actions.move_to_element_with_offset(element, 0, 0).perform()

但是,当我 运行 在我的 CentOS 7 实例上使用 chromedriver 99(最新可用)时,我得到了这个错误

>       raise exception_class(message, screen, stacktrace)
E       selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds
E         (Session info: headless chrome=99.0.4844.84)

/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: MoveTargetOutOfBoundsException

关于这意味着什么或我可能需要在我的 CentOS 7 设置上进行哪些额外配置的任何想法?很高兴重写代码,只要它在两种环境下都 运行s。

来自 MoveTargetOutOfBoundsException 的 Selenium 文档:

Indicates that the target provided to the actions move() method is invalid - outside of the size of the window.

来自 Actions class 文档:

moveByOffset​(int xOffset, int yOffset)
Moves the mouse from its current position (or 0,0) by the given offset.

这个问题对我来说很奇怪,因为我们正在谈论 body 元素,不知何故它不在屏幕的可见部分, 你可以试试:

  1. 滚动到您的元素 - 使用 JavaScript 或 Selenium

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);

  1. 等待元素加载完毕
  2. 不同的偏移量 - positive/negative.
  3. 获取 window 的 scrollheight/width 和主体的 X 和 Y 坐标 - 这可以帮助您调试问题。

document.body.scrollHeight

window.innerHeight

  1. 您可以尝试先点击或悬停该元素。

参考文献:
How to get the browser viewport dimensions?
https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.openqa.selenium.interactions.MoveTargetOutOfBoundsException
https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebElement.html#getLocation()

move_to_element_with_offset方法用于将鼠标移动指定元素的偏移量。偏移量相对于元素的 top-left 角。通常,当我们手动移动任何元素时,我们也需要点击元素然后移动它。希望这会有所帮助,如果没有请告诉我。

  element = self.driver.find_element(By.CSS_SELECTOR, "body")
  actions = ActionChains(self.driver)
  actions.move_to_element_with_offset(element, 0, 0).click().perform()