dong liang
dong liang

Reputation: 43

How to locate elements with Appium and Python?

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.

Upvotes: 3

Views: 13060

Answers (4)

Nafeez Quraishi
Nafeez Quraishi

Reputation: 6178

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

enter image description here

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

enter image description here

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.

Upvotes: 1

krishna chetan
krishna chetan

Reputation: 659

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)

enter image description here

Upvotes: 4

Uma Senthil
Uma Senthil

Reputation: 453

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)

Upvotes: 1

Astgh
Astgh

Reputation: 216

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. ;)

Upvotes: 0

Related Questions