简体   繁体   中英

How to locate elements with Appium and Python?

  • Testing a simple Calculator App on Android Device.
  • Tried many methods to locate an element, but failed.
  • The information I can get from UI Automator Viewer is the class name, button name, co-ordinates. I just want to locate the button "7" and press it.

Codes:

import unittest, time, os
from appium import webdriver
from time import sleep




class Android_Maaii(unittest.TestCase):
    "Class to run tests against the ATP WTA app"
    def setUp(self):
        "Setup for the test"
        PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.2.2'
        desired_caps['deviceName'] = 'Galaxy S4'
        desired_caps['app'] = PATH('C:\Python34\MyCalculator.apk')        
        # Since the app is already installed launching it using package and activity name
        desired_caps['appPackage'] = 'com.example.mythirdapp'
        desired_caps['appActivity'] = '.MainActivity'
        # Adding appWait Activity since the activity name changes as the focus shifts to the ATP WTA app's first page
        desired_caps['appWaitActivity'] = 'com.example.mythirdapp.MainActivity'
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        "Tear down the test"
        self.driver.quit()

    def test_maaii(self):
        #"Testing the ATP WTA app "
        self.driver.implicitly_wait(30)
        time.sleep(5)

        print ("Slept for 5 sec...")

        element = self.driver.find_element_by_name('7')

#---START OF SCRIPT
if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(Android_Maaii)
    unittest.TextTestRunner(verbosity=2).run(suite)

Error Report:

ERROR: test_maaii (__main__.Android_Maaii)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\testfiles\MaaiiTest_new.py", line 59, in test_maaii
    element = self.driver.find_element_by_name('7')
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 302, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 662, in find_element
    {'using': by, 'value': value})['value']
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 173, in execute
    self.error_handler.check_response(response)
  File "C:\Python34\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response
    raise wde
  File "C:\Python34\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
    super(MobileErrorHandler, self).check_response(response)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 166, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: 'An unknown server-side error occurred while processing the command.' 

======================================================================
ERROR: test_maaii (__main__.Android_Maaii)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python34\testfiles\MaaiiTest_new.py", line 31, in tearDown
    self.driver.quit()
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 455, in quit
    self.execute(Command.QUIT)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 173, in execute
    self.error_handler.check_response(response)
  File "C:\Python34\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
    super(MobileErrorHandler, self).check_response(response)
  File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 138, in check_response
    if 'message' in value:
TypeError: Type str doesn't support the buffer API

----------------------------------------------------------------------
Ran 1 test in 47.363s

FAILED (errors=2)

What is the real problem? I have tried all locate element methods but failed.

You can use uiautomatorviewer present in android SDK to get the id of each element, the you can use the id of the element. Then use

 self.driver.implicitly_wait(10)
 self.driver.find_element_by_id("com.android.calculator2:id/digit7").click()
 self.driver.implicitly_wait(10)

在此处输入图片说明

Try to use the resource_id of the element instead of the text. If you view in ui automator viewer, you will see the following properties for an element. For example, number 7 of the calculator has, com.android.calculator2:id/digit7 as resource_id.

So use can use this in your code as: element = self.driver.find_element_by_id("com.android.calculator2:id/digit7)

I am 0 in Python, I use Java but I think I had the same problem recently. I could find all elements, act with them, but couldn't press the button. To find elements use Appium Inspector.

And for the rest - This is my problem, already solved. look the solution under.

hope this helps. ;)

You can use appium server and use "Start Inspector Session" button from the Appium server instance as shown below(encircled).

在此处输入图片说明

Then launch the Activity to be inspected (locate elements) by filling desired capabilities and starting the session using "Start Session" as shown below

在此处输入图片说明

Once you obtain resource id from the intended Activity launched using this. Using following you can work with the resource ids in Python:

self.driver.find_element_by_id("resourceid").click()

Make sure the Appium server is running when running the test.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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