selenium.common.exceptions.WebDriverException:消息:尝试使用 Selenium 和 Python 单击元素时无法将数据转换为对象

selenium.common.exceptions.WebDriverException: Message: Failed to convert data to an object while trying to click an element with Selenium and Python

我在登录按钮后尝试单击页面上的按钮如下 HTML

<div id="carrierDashboardControls">
      <button class="yms-button-primary" ng-click="refresh()">
         <t>Refresh</t>
      </button>
      <button class="yms-button-primary-alt ng-isolate-scope" ng-csv="fetchData()" lazy-load="true" 
  csv-header="getCsvHeader" filename="carrier-dashboard.csv" field-separator=",">CSV
      </button>
</div>

这里有 2 个按钮,我想单击带有 class 的按钮 "yms-button-primary-alt ng-isolate-scope" 但是我得到以下错误

单击此按钮将下载 CSV 文件,但现在我收到错误 "selenium.common.exceptions.WebDriverException: Message: Failed to convert data to an object"

我目前正在使用以下代码,请注意,由于业务性质,无法共享实际的 url(由于登录后的重定向,我两次导航到 url)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re
import pandas as pd
import os


url = "THE URL"
username = 'USERNAME'
password = 'PASSWORD'

driver = webdriver.Firefox(executable_path=r'MYPATH/geckodriver.exe')
driver.implicitly_wait(100)
driver.get(url)

user_field = driver.find_element_by_id("ap_email")
pass_field = driver.find_element_by_id("ap_password")
sign_in = driver.find_element_by_id("signInSubmit")
user_field.send_keys(username)
pass_field.send_keys(password)
sign_in.click()
driver.implicitly_wait(100)
driver.get(url)
CSV_BUTTON = driver.find_element_by_class_name("yms-button-primary-alt ng-isolate-scope")
CSV_BUTTON.click()

作为补充说明,我想操作之后下载的文件,因为如果可能的话,我想用当前日期和时间自动重命名它?

下面是完整的堆栈跟踪

Traceback (most recent call last):
  File "C:/Users/USER/PycharmProjects/YMS scrape/venv/YMS Sel#.py", line 26, in <module>
    CSV_BUTTON = driver.find_element_by_class_name("yms-button-primary-alt ng-isolate-scope")
  File "C:\Users\USER\Anaconda3\envs\YMS scrape\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\Users\USER\Anaconda3\envs\YMS scrape\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Users\USER\Anaconda3\envs\YMS scrape\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\USER\Anaconda3\envs\YMS scrape\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to convert data to an object

所需元素是动态元素,通过 , so to click() on the element you have to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following :

可见
  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.yms-button-primary-alt.ng-isolate-scope[csv-header='getCsvHeader'][ng-csv^='fetchData']"))).click()
    
  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='yms-button-primary-alt ng-isolate-scope' and @csv-header='getCsvHeader'][contains(., 'CSV')]"))).click()
    
  • 注意:您必须添加以下导入:

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