![](/img/trans.png)
[英]Not understanding error message in Python: AttributeError: 'dict' object has no attribute 'append'
[英]WinAppDriver & Python error: AttributeError: 'dict' object has no attribute 'click'
我有一个迷你项目,需要使用 Python 在 GUI windows 应用程序上自动执行任务。
在尝试寻找解决方案时,我发现了类似于 Selenium 的 WinAppDriver。
当我尝试运行 python 示例代码时,它返回了这个错误:“AttributeError: 'dict' object has no attribute 'click'”
这里是python代码:
from appium import webdriver
class SimpleCalculatorTests(unittest.TestCase):
@classmethod
def setUpClass(self):
#set up appium
desired_caps = {}
desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
self.driver = webdriver.Remote(
command_executor='http://127.0.0.1:4723',
desired_capabilities= desired_caps)
@classmethod
def tearDownClass(self):
self.driver.quit()
def getresults(self):
displaytext = self.driver.find_element_by_accessibility_id("CalculatorResults").text
displaytext = displaytext.strip("Display is " )
displaytext = displaytext.rstrip(' ')
displaytext = displaytext.lstrip(' ')
return displaytext
def test_initialize(self):
self.driver.find_element_by_name("Clear").click()
self.driver.find_element_by_name("Seven").click()
self.assertEqual(self.getresults(),"7")
self.driver.find_element_by_name("Clear").click()
def test_addition(self):
self.driver.find_element_by_name("One").click()
self.driver.find_element_by_name("Plus").click()
self.driver.find_element_by_name("Seven").click()
self.driver.find_element_by_name("Equals").click()
self.assertEqual(self.getresults(),"8")
def test_combination(self):
self.driver.find_element_by_name("Seven").click()
self.driver.find_element_by_name("Multiply by").click()
self.driver.find_element_by_name("Nine").click()
self.driver.find_element_by_name("Plus").click()
self.driver.find_element_by_name("One").click()
self.driver.find_element_by_name("Equals").click()
self.driver.find_element_by_name("Divide by").click()
self.driver.find_element_by_name("Eight").click()
self.driver.find_element_by_name("Equals").click()
self.assertEqual(self.getresults(),"8")
def test_division(self):
self.driver.find_element_by_name("Eight").click()
self.driver.find_element_by_name("Eight").click()
self.driver.find_element_by_name("Divide by").click()
self.driver.find_element_by_name("One").click()
self.driver.find_element_by_name("One").click()
self.driver.find_element_by_name("Equals").click()
self.assertEqual(self.getresults(),"8")
def test_multiplication(self):
self.driver.find_element_by_name("Nine").click()
self.driver.find_element_by_name("Multiply by").click()
self.driver.find_element_by_name("Nine").click()
self.driver.find_element_by_name("Equals").click()
self.assertEqual(self.getresults(),"81")
def test_subtraction(self):
self.driver.find_element_by_name("Nine").click()
self.driver.find_element_by_name("Minus").click()
self.driver.find_element_by_name("One").click()
self.driver.find_element_by_name("Equals").click()
self.assertEqual(self.getresults(),"8")
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SimpleCalculatorTests)
unittest.TextTestRunner(verbosity=2).run(suite)
这是python响应:
C:\Users\anas9\PycharmProjects\winappdrivertest\venv\Scripts\python.exe C:/Users/anas9/PycharmProjects/winappdrivertest/main.py
test_addition (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:51: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("One").click()
ERROR
test_combination (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:58: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("Seven").click()
ERROR
test_division (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:70: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("Eight").click()
ERROR
test_initialize (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:45: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("Clear").click()
ERROR
test_multiplication (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:79: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("Nine").click()
ERROR
test_subtraction (__main__.SimpleCalculatorTests) ... C:\Users\anas9\PycharmProjects\winappdrivertest\main.py:86: DeprecationWarning: find_element_by_name is deprecated. Please use find_element(by=By.NAME, value=name) instead
self.driver.find_element_by_name("Nine").click()
ERROR
======================================================================
ERROR: test_addition (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 51, in test_addition
self.driver.find_element_by_name("One").click()
AttributeError: 'dict' object has no attribute 'click'
======================================================================
ERROR: test_combination (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 58, in test_combination
self.driver.find_element_by_name("Seven").click()
AttributeError: 'dict' object has no attribute 'click'
======================================================================
ERROR: test_division (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 70, in test_division
self.driver.find_element_by_name("Eight").click()
AttributeError: 'dict' object has no attribute 'click'
======================================================================
ERROR: test_initialize (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 45, in test_initialize
self.driver.find_element_by_name("Clear").click()
AttributeError: 'dict' object has no attribute 'click'
======================================================================
ERROR: test_multiplication (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 79, in test_multiplication
self.driver.find_element_by_name("Nine").click()
AttributeError: 'dict' object has no attribute 'click'
======================================================================
ERROR: test_subtraction (__main__.SimpleCalculatorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\anas9\PycharmProjects\winappdrivertest\main.py", line 86, in test_subtraction
self.driver.find_element_by_name("Nine").click()
AttributeError: 'dict' object has no attribute 'click'
----------------------------------------------------------------------
Ran 6 tests in 1.314s
FAILED (errors=6)
Process finished with exit code 0
此处提供的示例: WinAppDriver/tree/master/Samples/Python
谢谢,
为了详细说明 Anas H 的答案,驱动程序正在返回一个字典,但它应该返回一个 WebElement。 简而言之,WinAppDriver 目前似乎没有完全支持 Selenium 4,但它确实支持 Selenium 3.14。 使用 Anas H 提供的 pip 命令
pip install selenium==3.14
或者对于 PyCharm,在 Python Packages 下,您可以输入 Selenium 并删除当前的 selenium 包。 研究 Selenium 而不是 Selenium 4,选择您想要的 Selenium 3.1 版本,我再次使用 3.14。
如果出于某种原因您选择坚持使用 Selenium 4,那么您在提供的示例中可能遇到的其他问题将是“find_element()”函数。 您需要从 selenium.webdriver.common.by 导入“By”才能找到任何特定元素。
# Selenium 3
self.driver.find_element_by_name("Nine").click()
# Selenium 4
from selenium.webdriver.common.by import By
self.driver.find_element(By.NAME, "Nine")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.