AttributeError: у объекта «WebElement» нет атрибута «copy», ошибка при перемещении функции Выбрать в общий файл с помощью Selinium Python - Django - PullRequest
1 голос
/ 17 января 2020

У меня есть 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>

Я хочу выбрать и выбрать значение этого, когда я использую определение функции в тестовом файле. Это будет работать OK

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'

1 Ответ

2 голосов
/ 17 января 2020

Это сообщение об ошибке ...

  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)) не выполнена и при использовании framework super().__init__(attrs) было вызывается, что приводит к ошибке:

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

Решение

Для идеального выбора нужного элемента вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующие Стратегии локатора :

  • Использование 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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...