硒 Python: Actions.move_to_element 不工作

Selenium Python: Actions.move_to_element not working

我目前正在进行 selenium 测试以测试一些分页按钮

这些按钮在屏幕视口之外...

在 firefox 中我可以很好地执行这段代码 (显然 driver = webdriver.Firefox)

from selenium.webdriver.common.action_chains import ActionChains
import selenium.common.exceptions
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
url = 'https://whosebug.com'

driver.get(url)
driver.maximize_window()

footer_link = driver.find_element_by_css_selector("#footer > div > nav > div:nth-child(1) > h5 > a")
action = ActionChains(driver)
action.move_to_element(footer_link).click().perform()
driver.quit()

(顺便说一句,这是我的错误的最小产物)

同样,代码在 firefox 中运行良好

但是在 Chrome(版本 89)中,代码失败并出现此错误

selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds

我已经尝试了一些方法来让它工作,我已经能够通过使用 execute_script() 滚动到元素来让它工作,但我需要使用 sleep(),隐式等待, 或显式等待。

我想使用既定的方式在不使用睡眠的情况下滚动到元素,也就是使用 ActionChains object

从互联网上的一点点挖掘来看,我认为这段代码可以工作,但我不断收到同样的错误...

如有任何帮助,我们将不胜感激!

https://github.com/SeleniumHQ/selenium/issues/7315

您必须先将其滚动到视图中,

also isvisible 不检查元素是否在视口中,因此无法使用等待可见性

https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/8054

所以使用:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import selenium.common.exceptions
from selenium import webdriver
import time

from selenium.webdriver.support.wait import WebDriverWait

options = webdriver.ChromeOptions()

driver = webdriver.Chrome()
url = 'https://whosebug.com'

driver.get(url)
driver.maximize_window()

 
footer_link=WebDriverWait(driver, 10).until(EC.presence_of_element_located(
   (By.CSS_SELECTOR, "#footer > div > nav > div:nth-child(1) > h5 > a")))

driver.execute_script("arguments[0].scrollIntoView()", footer_link)

time.sleep(3)


footer_link.click()

driver.quit()

您也可以使用自定义等待:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import selenium.common.exceptions
from selenium import webdriver
import time

from selenium.webdriver.support.wait import WebDriverWait

options = webdriver.ChromeOptions()

driver = webdriver.Chrome()
url = 'https://whosebug.com'

driver.get(url)
driver.maximize_window()

 
footer_link=WebDriverWait(driver, 10).until(EC.presence_of_element_located(
   (By.CSS_SELECTOR, "#footer > div > nav > div:nth-child(1) > h5 > a")))

driver.execute_script("$('footer').scrollIntoView(true)", footer_link)

WebDriverWait(driver, 100).until(lambda a: driver.execute_script(
    "return parseInt($('html').scrollTop())>6500"))


footer_link.click()

driver.quit()

我在这里使用 jquery.scrollTop() 来获取当前滚动位置。