【问题标题】:selenium.common.exceptions.WebDriverException: Message: Failed to convert data to an object while trying to click an element with Selenium and Pythonselenium.common.exceptions.WebDriverException:消息:尝试使用 Selenium 和 Python 单击元素时无法将数据转换为对象
【发布时间】:2020-03-11 16:59:06
【问题描述】:

我在登录按钮后尝试单击页面上的按钮是以下 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 个按钮,我想单击一个有类的按钮 “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

【问题讨论】:

  • 你能分享完整的堆栈跟踪吗?
  • @AlexeyR。抱歉,我不知道怎么找到?你的意思是回溯吗?如果有帮助,我正在使用 pycharm
  • 是的,基本上它是一个调用堆栈,显示异常发生的位置以及失败之前的调用。通常它以开发模式打印,但有时会被抑制。
  • @AlexeyR。我想我把它都加在了帖子的底部?如果我很傻,一定要告诉我,这不是它

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

所需的元素是一个动态元素,它通过 变得可见,因此对于click() 元素,您必须为element_to_be_clickable() 诱导WebDriverWait,您可以使用关注Locator Strategies

  • 使用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
    

【讨论】:

  • 谢谢,我不得不输入睡眠命令,因为其他东西遮挡了按钮几秒钟,但只有 5 秒钟
猜你喜欢
  • 2019-08-09
  • 2019-08-08
  • 2019-07-25
  • 2018-12-26
  • 1970-01-01
  • 2019-08-09
  • 2018-05-26
  • 2017-12-22
相关资源
最近更新 更多