硒 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() 来获取当前滚动位置。
我目前正在进行 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() 来获取当前滚动位置。