【问题标题】:AttributeError: 'WebElement' object has no attribute 'copy' error when moved the function Select to a common file using Selenium Python through DjangoAttributeError: 'WebElement' object has no attribute 'copy' error when move the function Select to a common file using Selenium Python through Django
【发布时间】:2020-01-17 07:48:21
【问题描述】:

我有一个这样的 HTML 元素

<select id="my_id">
<option value="">ALL</option>
<option value="1.0">ALL</option>
<option value="2.0">A</option>
<option value="3.0">B</option>
<option value="4.0">C</option>
</select>

当我在测试文件中使用定义函数时,我想选择并选择一个值 它会正常工作

my_test_file.py
def _find_and_select(self, elm_id, value):
    select_item = Select(self.browser.find_element_by_id(elm_id))
    select_item.select_by_value(value)
self._find_and_select("my_id", "1.0")

但是当我移动到一个通用的测试文件时

common_file.py
class Common:
    @staticmethod
    def _find_and_select(browser, elm_id, value):
        select_item = Select(browser.find_element_by_id(elm_id))
        select_item.select_by_value(value)

my_test_file.py
Common._find_and_select(self.browser, "my_id", "1.0")

会报错:

Traceback (most recent call last):
  File "D:\iBNet-Prj\ibnet\apps\autotest\contract\tests.py", line 251, in test_search
    CommonTest._find_and_select(self.browser, "contractLoanStatus", loanStatus[0])
  File "D:\iBNet-Prj\ibnet\apps\common_test.py", line 467, in _find_and_select
    select_item = Select(browser.find_element_by_id(elm_id))
  File "D:\iBNet-Prj\venv\lib\site-packages\django\forms\widgets.py", line 558, in __init__
    super().__init__(attrs)
  File "D:\iBNet-Prj\venv\lib\site-packages\django\forms\widgets.py", line 201, in __init__
    self.attrs = {} if attrs is None else attrs.copy()
AttributeError: 'WebElement' object has no attribute 'copy'

【问题讨论】:

    标签: python django selenium selenium-webdriver webdriver


    【解决方案1】:

    此错误消息...

      File "D:\iBNet-Prj\ibnet\apps\common_test.py", line 467, in _find_and_select
        select_item = Select(browser.find_element_by_id(elm_id))
      File "D:\iBNet-Prj\venv\lib\site-packages\django\forms\widgets.py", line 558, in __init__
        super().__init__(attrs)
      File "D:\iBNet-Prj\venv\lib\site-packages\django\forms\widgets.py", line 201, in __init__
        self.attrs = {} if attrs is None else attrs.copy()
    AttributeError: 'WebElement' object has no attribute 'copy'
    

    ...暗示代码行 select_item = Select(browser.find_element_by_id(elm_id)) 失败,并且您正在使用 框架 super().__init__(attrs) 被调用,这会产生错误:

    AttributeError: 'WebElement' object has no attribute 'copy'
    

    解决方案

    要理想地选择所需的元素,您必须为 element_to_be_clickable() 诱导 WebDriverWait,您可以使用以下任一 Locator Strategies:

    • 使用CSS_SELECTOR:

      select_item = Select(WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select#my_id"))))
      select_item.select_by_value(value)
      
    • 使用XPATH:

      select_item = Select(WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='my_id']"))))
      select_item.select_by_value(value)
      
    • 注意:您必须添加以下导入:

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

    【讨论】:

    • 非常感谢,我会试试的
    • 很好的解释
    猜你喜欢
    • 2021-01-12
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多