【问题标题】:Is it posssible to store selenium objects? (Python)是否可以存储硒对象? (Python)
【发布时间】:2019-12-04 19:57:35
【问题描述】:

我试图在我的自动化程序中捕获错误并将它们作为参数传递给另一个函数。 我的目标是存储这些在自动机期间导致错误的 selenium 对象,并在主要功能完成后处理它们。

现在,我将错误详细信息发送到 csv 文件中:

def send_keys_dropdown(self,url,csv_name):
        elements = bot.find_elements_by_xpath("//a[@data-tag='globalize']")
        for elem in elements:
            class_of_element = elem.get_attribute("class")
            if class_of_element == 'CsLinkButton':
                try:
                   # Some actions here
                except (ElementNotInteractableException, ElementNotVisibleException) as e:
                    handle_errors(elem, url, e)
                    pass

如您所见,handle_errors() 函数接受 3 个参数,并且:

    def handle_errors(self, elem, url, e):
        bot = self.bot
        with open('errors.csv', mode='w', newline='', encoding="utf-8") as csv_file:
            fieldnames = ['URL', 'Element', 'Error']
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerow({ 'URL': url, 'Element': elem, 'Error':e })
        with open('errors.csv', 'rt',encoding='utf8') as csvfile:
            errors_list = csv.reader(csvfile, delimiter=',', quotechar='"')
            errors_list = list(errors_list)
            bot.get(url)
            time.sleep(3)

此函数将从 csv 获取 url 并转到导致错误的页面,下一个应该是查找导致错误的元素。但是,我不知道如何存储这些 selenium 对象。

我尝试直接传递元素(不写入 csv),但仍然无法正常工作。

感谢您的帮助!

【问题讨论】:

  • 使用 element.getAttribute('innerHTML') 和 element.getAttribute('outerHTML')

标签: python selenium automation


【解决方案1】:

我假设您想在主脚本完成后重试/调查错误。在这种情况下,无法直接保存 WebElement 对象以供将来使用,因为该元素的所有上下文都已丢失。

您可以将定位器保存到 csv,或者按照@pcalkins 的建议,如果您想稍后进行调查,可以保存 HTML 的内容。

另外,我建议您将部分读取错误从handle_error() 中拆分出来,并将其移至您要重试/调查的位置。

    def send_keys_dropdown(self,url,csv_name):
        by, locator = By.XPATH, "//a[@data-tag='globalize']"
        elements = bot.find_elements_by_xpath("//a[@data-tag='globalize']")
        for elem in elements:
            class_of_element = elem.get_attribute("class")
            if class_of_element == 'CsLinkButton':
                try:
                   # Some actions here
                except (ElementNotInteractableException, ElementNotVisibleException) as e:
                    handle_errors(by, locator, url, e)
                    pass

    def handle_errors(self, by, locator, url, e):
        bot = self.bot
        with open('errors.csv', mode='w', newline='', encoding="utf-8") as csv_file:
            fieldnames = ['URL', 'By', 'Locator', 'Error']
            writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerow({ 'URL': url, 'By': by, 'Locator': locator, 'Error':e })

    def retry_errors(self):
        bot = self.bot
        with open('errors.csv', 'rt',encoding='utf8') as csvfile:
            errors_list = csv.reader(csvfile, delimiter=',', quotechar='"')
            errors_list = list(errors_list)
            for error in errors_list:
              # actions you want to retry

【讨论】:

  • 很好的解决方案,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2016-09-17
  • 2016-06-04
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多