繁体   English   中英

WinAppDriver & Python 错误:AttributeError:“dict”对象没有属性“click”

[英]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

谢谢,

我找到了解决方案,即通过运行将 Selenium 恢复为 3.141.0:

pip install selenium==3.141.0

资源

为了详细说明 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")

https://github.com/microsoft/WinAppDriver/issues/1638

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM