python - AttributeError: 'WebElement' object has no attribute 'copy' error when move the function Select to a common file using Selenium Python through Django
问题描述
我有一个这样的 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'
解决方案
此错误消息...
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))
失败,并且在您使用django框架super().__init__(attrs)
时被调用,这会产生错误:
AttributeError: 'WebElement' object has no attribute 'copy'
解决方案
要理想地选择所需的元素,您必须诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一 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
推荐阅读
- sql - 当 SELECT 语句没有返回任何行时,打印一条自定义消息
- curl - 仅使用 curl 获取 google Oauth2 访问令牌
- python - 如何在基于面部的考勤中为每一天创建一个单独的 CSV 文件,而不是覆盖现有的
- windows - Win10/Ubuntu16双启动系统如何将power BI连接到postgresql数据库?
- keras - 使用 keras image_dataset_from_directory 时如何添加标签?
- java - CSS中的背景图像属性不起作用
- timezone - Nuxt JS 在用户的时区显示日期和时间
- android - 如何在 Compose 函数的按钮单击中启动 Intent
- typescript - 如何从 Firebase Cloud Functions 中调用 Google Places API?
- php - Laravel 需要 2 次登录 1 基于 account_type 的表需要重定向不同的地方