执行webdriver.ActionChains(driver).move_to_element(element).click(element).perform()时,报错selenium.common.exceptions.JavascriptException: Message: javascript error: Failed to execute 'elementsFromPoint' on 'Document': The provided double value is non-finite.这是为什么?
时间: 2024-03-20 15:41:03 浏览: 146
这个错误通常是由于 `element` 定位到的元素不在当前的可视区域内,导致 `move_to_element` 方法无法正确执行。在这种情况下,`click` 操作可能会被视为非法的,并导致 JavaScript 错误。
为了解决这个问题,你可以尝试使用 `WebDriverWait` 显式等待,直到元素可见后再执行操作,例如:
```python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "my-element"))
)
actions = webdriver.ActionChains(driver)
actions.move_to_element(element).click().perform()
```
这个方法首先使用 `WebDriverWait` 等待元素可见,然后使用 `ActionChains` 执行操作。
如果你还是遇到问题,请提供完整的错误信息和代码,以便更好地定位问题。
相关问题
from selenium import webdriver import time from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains # 读取操作excel表格 import openpyxl , 上述代码如何进行封装, 方便引用
可以将上述代码封装为一个函数,如下所示:
```
import openpyxl
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
def login(username, password):
# 读取操作 excel 表格
wb = openpyxl.load_workbook('example.xlsx')
ws = wb.active
# 启动 Chrome 浏览器
service = Service('chromedriver')
driver = webdriver.Chrome(service=service)
driver.get('https://www.example.com/login')
# 输入用户名和密码
username_field = driver.find_element(By.ID, 'username')
password_field = driver.find_element(By.ID, 'password')
username_field.send_keys(username)
password_field.send_keys(password)
# 点击登录按钮
login_button = driver.find_element(By.ID, 'login-button')
ActionChains(driver).move_to_element(login_button).click().perform()
# 关闭浏览器并保存 excel 表格
driver.quit()
wb.save('example.xlsx')
```
然后在其他文件中可以直接引用该函数,如下所示:
```
from login import login
# 使用封装的 login 函数登录账号
login('your_username', 'your_password')
```
这样可以避免代码重复,也方便维护。
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Chrome() # 启动浏览器 driver.get('https://kyfw.12306.cn/otn')# 控制浏览器,访问12306 time.sleep(5) #driver.find_element("id","J-userName").click() driver.find_element('id','J-userName').send_keys('13818573925') driver.find_element('id','J-password').send_keys('Aa26542') time.sleep(5) driver.find_element('id','J-login').click() #print('continue') time.sleep(4) span=driver.find_element('id','nc_1_n1z') actions=ActionChains(driver) time.sleep(2) #aco.click_and_hold(span) actions.click_and_hold(span).move_by_offset(300, 0).perform() # 滑动 time.sleep(10) #driver.quit() # 关闭浏览器
根据您提供的代码,您正在尝试使用 Selenium 模拟登录 12306,并滑动验证码滑块。但是,我注意到您在滑动滑块之前没有进行点击和按住操作。您可以尝试修改代码如下:
```python
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://kyfw.12306.cn/otn')
time.sleep(5)
driver.find_element('id', 'J-userName').send_keys('13818573925')
driver.find_element('id', 'J-password').send_keys('Aa26542')
time.sleep(5)
driver.find_element('id', 'J-login').click()
time.sleep(4)
span = driver.find_element('id', 'nc_1_n1z')
actions = ActionChains(driver)
actions.click_and_hold(span).move_by_offset(300, 0).perform() # 点击并按住滑块,然后滑动
time.sleep(10)
driver.quit()
```
请注意,上述代码中的 `300` 是根据您的实际情况设置的滑动距离,您可能需要根据实际情况进行调整。
如果您在运行上述代码时仍然遇到问题,请提供更多详细的错误信息和问题描述,以便我更好地帮助您解决问题。
阅读全文