首页 > 解决方案 > 尝试使用 Python 和 Selenium 将对象序列化为 JSON 时出现属性错误

问题描述

我收到以下错误:

return json.dumps(obj, default=lambda o: o.__dict__)
AttributeError: 'mappingproxy' object has no attribute '__dict__'

这里是主要的:

from selenium import webdriver
from pages.cmc_home_page import CMCHomePage
from selenium import webdriver
import open_tagged_tickets

def get_driver():
    options = webdriver.ChromeOptions()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    browser = webdriver.Chrome(options=options)
    cmc_home_page = CMCHomePage(driver=browser)
    return cmc_home_page

def main():
    cmc_home_page=get_driver()
    cmc_home_page.go()
    open_tagged_tickets.open_tagged_tickets(cmc_home_page)
    
main()

这是 open_tagged_tickets 函数:

from selenium.webdriver.support.select import Select
import json

def open_tagged_tickets(driver):
    iframe=driver.iframe()
    driver = json.dumps(driver.toJson(), indent=4)
    driver.switch_to_iframe(iframe)

这是 CMCHomePage 类:

from selenium.webdriver.common.by import By
from pages.base_element import BaseElement
from pages.base_page import BasePage
from pages.locator import Locator
import json

class CMCHomePage(BasePage):

    def iframe(self):
        locator = Locator(by=By.CSS_SELECTOR, value="iframe[id='main_body'][name='main_body']")
        return BaseElement(driver=self.driver, locator=locator)

    def last_elem_to_load(self):
        locator = Locator(by=By.CSS_SELECTOR, value="tr[role='row']")
        return BaseElement(driver=self.driver, locator=locator)

    def toJson(obj):
        return json.dumps(obj, default=lambda o: o.__dict__)

    def switch_to_iframe(self, frame):
        self.driver.switch_to.frame(frame)

它导入以下两个类:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BaseElement(object):
    def __init__(self, driver, locator):
        self.driver = driver
        self.locator = locator

        self.web_element = None
        self.find()

    def find(self):
        element = WebDriverWait(self.driver, 30).until(
            EC.visibility_of_element_located(locator=self.locator)
        )
        self.web_element = element
        return None

    def input_text(self, txt):
        self.web_element.send_keys(txt)
        return None

    def click(self):
        element = WebDriverWait(self.driver, 30).until(
            EC.element_to_be_clickable(locator=self.locator)
        )
        element.click()
        return None

    def attribute(self, attr_name):
        attribute = self.web_element.get_attribute(attr_name)
        return attribute
    
    @property
    def text(self):
        text = self.web_element.text
        return text

class BasePage(object):

    url = None

    def __init__(self, driver):
        self.driver = driver

    def go(self):
        self.driver.get(self.url)

而且我不知道为什么我会遇到这个问题。我只想切换到 iframe,以便程序可以继续运行。当我只是使用函数时它运行良好,但后来我决定继续使用面向对象。任何帮助将不胜感激。

标签: pythonjsonseleniumserialization

解决方案


推荐阅读