{"id":1676,"date":"2014-10-13T01:04:07","date_gmt":"2014-10-13T05:04:07","guid":{"rendered":"http:\/\/qxf2.com\/blog\/?p=1676"},"modified":"2019-06-27T03:37:58","modified_gmt":"2019-06-27T07:37:58","slug":"appium-tutorial-python-physical-device","status":"publish","type":"post","link":"https:\/\/qxf2.com\/blog\/appium-tutorial-python-physical-device\/","title":{"rendered":"Appium tutorial: Execute Python tests on mobile devices"},"content":{"rendered":"<p>This Appium tutorial will show you how to run automated tests on a real physical device. We estimate skimming through this post will take you 10 minutes. We estimate working through this post, step by step, will take you about 90 minutes. In this post we will cover getting setup with Appium, interfacing with real devices, writing and running Appium tests. We also briefly introduce you to multiple ways to locate UI elements.<\/p>\n<p><strong>NOTE:<\/strong> If you have an Android phone handy, you can follow along easily. If not, you may be interested in a previous post showing you how to get started with <a href=\"https:\/\/qxf2.com\/blog\/appium-mobile-automation\">Appium on an emulator<\/a>.<\/p>\n<hr \/>\n<h3>Why this post?<\/h3>\n<p>There are two compelling reasons for this post.<br \/>\n<u>1. Mobile devices are taking over the world<\/u><br \/>\nIn recent times there is a lot of interest in mobile testing. And rightly so. The mobile space is growing. The apps are the new cool thing. The mobile space is ideal for software testers looking to learn new things and keep current.<br \/>\n<u>2. Lack of high quality tutorials on mobile automation<\/u><br \/>\nOne big challenge in the mobile automation space is the the limited amount of information about the technologies. Quality sources of information on mobile automation is very limited.<\/p>\n<p>So here is a high quality and informative tutorial for the hands-on tester who wants to get started with Appium and mobile automation on a physical mobile device.<\/p>\n<hr \/>\n<h3>Why Appium?<\/h3>\n<p>There are quite a few number of tools out there in the mobile automation market like <a href=\"https:\/\/www.cloudmonkeymobile.com\/monkeytalk\">MonkeyTalk<\/a>, <a href=\"http:\/\/calaba.sh\/\">Calabash<\/a>, <a href=\"https:\/\/code.google.com\/p\/robotium\/\">Robotium<\/a>, etc. Each has its own advantages and limitations. Some of these tools require an agent to be installed, the application has to be recompiled so that the tool can interact with the mobile app, etc. However <a href=\"http:\/\/appium.io\/\">Appium<\/a> is built on the idea that testing native apps shouldn&#8217;t require including an SDK or recompiling the app. Appium is also an open source project &#8211; so if you are not happy with it, you can contribute and enhance it. Appium tests run against both on iOS and Android. For me, Appium (while still being extremely immature), looks to be the standout technology that will own the mobile UI automation space. Appium reminds me of the early Selenium versions I used. Based on history, I think Appium will be the front-runner in the mobile UI automation space.<\/p>\n<hr \/>\n<h3>Step by step Appium tutorial<\/h3>\n<p>We have already shown you how to run an Appium test using an emulator in one of our <a href=\"https:\/\/qxf2.com\/blog\/appium-mobile-automation\/\">previous<\/a> posts. In this post, I will show you how to test an app using a real device. Being a tennis fan, I decided to test a tennis app. On my Android phone, I downloaded the <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=atpwta.live&amp;hl=en\">ATP\/WTA<\/a> app and decided to automate some of the functionality of this app. I will also show you how to navigate through different pages in the app using different locator strategies, get data from a table using Appium and Python and how to use the <a href=\"http:\/\/developer.android.com\/tools\/help\/uiautomator\/index.html\">uiautomator<\/a> to find UI components of the page.<\/p>\n<p><strong>Overview<\/strong><br \/>\n1. Appium setup<br \/>\n2. Connect to an Android device<br \/>\n3. Select an app to test, get its package and activity name<br \/>\n4. Use uiautomatorviewer to find UI components of the application<br \/>\n5. Write the test<br \/>\n6. Start and launch Appium server console<br \/>\n7. Run the test<br \/>\n8. View the test result<\/p>\n<p><strong>STEP 1: Appium setup<\/strong><br \/>\nDownload and install <a href=\"http:\/\/developer.android.com\/sdk\/index.html\">Android SDK<\/a> and <a href=\"https:\/\/github.com\/appium\/appium\/releases\">Appium<\/a> along with <a href=\"https:\/\/github.com\/appium\/python-client\">Appium&#8217;s client libraries<\/a> for Python. Installations are fairly straight forward. However if you need help, please refer to the setup section in our <a href=\"https:\/\/qxf2.com\/blog\/appium-mobile-automation\/\">previous<\/a> blog for a more detailed process on how to set up Appium on your machine.<\/p>\n<p><strong>STEP 2: Connect to an Android device<\/strong><br \/>\nYou have to enable USB debugging in your phone to be able to run your test scripts. For this, first, you need to enable &#8220;Developer options&#8221; by navigating to Settings\/About Phone and tapping build number seven times. You will get a notification saying that you&#8217;re now a developer. Ignore it &#8211; you are still a tester ;). Once you are a developer you need to navigate to &#8220;Developer options&#8221; and enable the USB debugging option. You can refer to this <a href=\"http:\/\/www.phonearena.com\/news\/How-to-enable-USB-debugging-on-Android_id53909\">link<\/a> for more details<\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_BuildNumber.png\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-1739\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_BuildNumber-168x300.png\" alt=\"Build Number in Android Settings\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_BuildNumber-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_BuildNumber.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_USBDebugging.png\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1741\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_USBDebugging-168x300.png\" alt=\"Enable USB Debugging\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_USBDebugging-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_USBDebugging.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_DeveloperOptions.png\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1740\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_DeveloperOptions-168x300.png\" alt=\"Developer Option in Android settings\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_DeveloperOptions-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Settings_DeveloperOptions.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><\/p>\n<p>Note: On some devices, you may have to download some device drivers to connect your phone to the PC<\/p>\n<p><strong>STEP 3: Select an app to test, get its package and activity name<\/strong><br \/>\nYou can go to Google Play Store and download the <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=atpwta.live&amp;hl=en\">ATP\/WTA<\/a> app. We will automate some of the functionality like navigating to the ATP Singles Rankings view to assert that Novak Djokovic is the first player listed and also get his personal details from the table in players view.<\/p>\n<p>In order to start the app we would need the app Package and Activity name. We can get these details from the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Android_application_package\">apk<\/a> file of the app. Instead of downloading the apk file and looking into <a href=\"http:\/\/developer.android.com\/guide\/topics\/manifest\/manifest-intro.html\">app manifest<\/a> file for this detail, we can also download some really cool apps which can get you these details. <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.wt.apkinfo\">Apk Info<\/a> is one such app which you can download from Play Store and get the app Package and Activity details. Just download the app and click on Apk Info Icon which will list all the apps on your device. Click on your app to get the details required as shown below<\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/APK_Info.jpeg\" data-rel=\"lightbox-image-3\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-11046 alignleft\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/APK_Info-169x300.jpeg\" alt=\"APK Info for getting the Package and Activity name\" width=\"169\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/APK_Info-169x300.jpeg 169w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/APK_Info-576x1024.jpeg 576w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/APK_Info.jpeg 720w\" sizes=\"auto, (max-width: 169px) 100vw, 169px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP_WTA_Details.jpeg\" data-rel=\"lightbox-image-4\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-11047\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP_WTA_Details-169x300.jpeg\" alt=\"Details of ATP WTA app\" width=\"169\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP_WTA_Details-169x300.jpeg 169w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP_WTA_Details-576x1024.jpeg 576w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP_WTA_Details.jpeg 720w\" sizes=\"auto, (max-width: 169px) 100vw, 169px\" \/><\/a><\/p>\n<p><strong>STEP 4: Use uiautomatorviewer to find UI components of the application<\/strong> uiautomatorviewer is a GUI tool to scan and analyze the UI components of an Android application. To click or to navigate to any components in your app you need to identify the UI components of your application. Using uiautomatorviewer you can take the snapshot of the UI screen on any Android device that is connected to your machine. You can then inspect the layout hierarchy and view the properties of the individual UI components that are displayed on the device.<\/p>\n<p>Connect your Android device to your machine and open the app you are testing. In your machine open a terminal window and navigate to the path<em> $android-sdk \/tools<\/em> and run the command to open Uiautomatorviewer<\/p>\n<pre lang=\"python\">$ uiautomatorviewer\r\n<\/pre>\n<p>To capture a screen, click the &#8220;Device Screenshot button&#8221; in the uiautomatorviewer tool. The screenshot of the page in your device is captured. You can move over the snapshot in the left-hand panel to see the UI components identified by the uiautomatorviewer. You can view the component\u2019s properties listed in the lower right-hand panel, and the layout hierarchy in the upper right-hand panel.<br \/>\n<a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/uiautomatorviewer.jpg\" data-rel=\"lightbox-image-5\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1729\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/uiautomatorviewer-300x224.jpg\" alt=\"UI Automator Viewer\" width=\"300\" height=\"224\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/uiautomatorviewer-300x224.jpg 300w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/uiautomatorviewer.jpg 788w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><strong>STEP 5: Write the test<\/strong><br \/>\nWe will launch the ATP WTA app using the package and activity name we found out and then navigate through various pages using different locator strategies. While we do not recommend using multiple locator strategies, we are doing so in this tutorial only to make you aware of your options. Then we will confirm that Novak Djokovic is the top player listed in ATP Singles Rankings list view and get his personal details from a table in Players view.<\/p>\n<pre lang=\"python\">\"\"\"\r\nQxf2: Example script to run one test against ATP_WTA app using Appium\r\nThe test will navigate to ATP Singles Rankings list and confirm that Novak\r\nDjokovic is the top player listed and get his personal details from a table.\r\n\r\n\"\"\"\r\n\r\nimport unittest, time, os\r\nfrom appium import webdriver\r\nfrom time import sleep\r\n\r\nclass Android_ATP_WTA(unittest.TestCase):\r\n    \"Class to run tests against the ATP WTA app\"\r\n    def setUp(self):\r\n        \"Setup for the test\"\r\n        desired_caps = {}\r\n        desired_caps['platformName'] = 'Android'\r\n        desired_caps['platformVersion'] = '4.4'\r\n        desired_caps['deviceName'] = '$ Your device name'\r\n        # Since the app is already installed launching it using package and activity name\r\n        desired_caps['appPackage'] = 'atpwta.live'\r\n        desired_caps['appActivity'] = '.activity.Main'\r\n        # Adding appWait Activity since the activity name changes as the focus shifts to the ATP WTA app's first page\r\n        desired_caps['appWaitActivity'] = '.activity.root.TournamentList'\r\n        self.driver = webdriver.Remote('http:\/\/localhost:4723\/wd\/hub', desired_caps)\r\n\r\n    def tearDown(self):\r\n        \"Tear down the test\"\r\n        self.driver.quit()\r\n\r\n    def test_atp_wta(self):\r\n        \"Testing the ATP WTA app \"\r\n        self.driver.implicitly_wait(30)\r\n        time.sleep(5)\r\n        \r\n        # click on Navigation Bar MainMenu by finding element by xpath\r\n        menubar = self.driver.find_element_by_xpath(\"\/\/android.widget.Spinner[@resource-id='atpwta.live:id\/NavBarMainMenuSpinner']\")\r\n        menubar.click()\r\n        \r\n        # From list of options available click on Rankings by finding element using uiautomator\r\n        rankings = self.driver.find_element_by_android_uiautomator('new UiSelector().text(\"Rankings\")')\r\n        rankings.click()\r\n        \r\n        # click on ATP Singles by finding element using id\r\n        singles = self.driver.find_element_by_id('atpwta.live:id\/RankingsListItem')\r\n        singles.click()\r\n\r\n        # Assert that Novak Djokovic is the top listed player\r\n        elmnt = self.driver.find_element_by_id('atpwta.live:id\/Player1TV')\r\n        self.assertEqual('Novak Djokovic', elmnt.get_attribute('text'))\r\n        print elmnt.get_attribute('text')\r\n\r\n        elmnt = self.driver.find_element_by_xpath(\"\/\/android.widget.LinearLayout[@index=0]\")\r\n        elmnt.click()\r\n        \r\n        # Print the contents of Table listed for the top ranked player\r\n        table = self.driver.find_element_by_android_uiautomator(\"new UiSelector().className(android.widget.TableLayout)\")\r\n        rows = table.find_elements_by_class_name('android.widget.TableRow')\r\n        for i in range(0, len(rows)):\r\n            cols = rows[i].find_elements_by_class_name('android.widget.TextView')\r\n            for j in range(0, len(cols)):\r\n                print(cols[j].get_attribute('text')+\" -- \"),\r\n            print(\"\")\r\n      \r\n               \r\n#---START OF SCRIPT\r\nif __name__ == '__main__':\r\n    suite = unittest.TestLoader().loadTestsFromTestCase(Android_ATP_WTA)\r\n    unittest.TextTestRunner(verbosity=2).run(suite)\r\n\r\n<\/pre>\n<p><strong>STEP 6: Start and launch Appium server<\/strong><br \/>\nStart Appium server console by double-clicking on the Appium file. Click on the \u2018rocket\u2019 icon to launch the Appium node server.<br \/>\nPlease refer to the 6th and 7th step of our <a href=\"https:\/\/qxf2.com\/blog\/appium-mobile-automation\/\">previous<\/a> blog if you need more details on starting appium server.<br \/>\n<a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Appium1.png\" data-rel=\"lightbox-image-6\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1737\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Appium1.png\" alt=\"Start Appium\" width=\"394\" height=\"420\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Appium1.png 394w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Appium1-281x300.png 281w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/a><\/p>\n<p><strong>STEP 7: Run the test<\/strong><br \/>\nYou can run the test any way you like. We will run it using the command prompt. The app gets launched in your device and navigates to a different screen.<\/p>\n<p><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-WTA-Live-Page.png\" data-rel=\"lightbox-image-7\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-1795\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-WTA-Live-Page-168x300.png\" alt=\"ATP WTA Live Page\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-WTA-Live-Page-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-WTA-Live-Page.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Players-Page.png\" data-rel=\"lightbox-image-8\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1796\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Players-Page-168x300.png\" alt=\"Players Page\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Players-Page-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/Players-Page.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-Rankings-List-Page.png\" data-rel=\"lightbox-image-9\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1797\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-Rankings-List-Page-168x300.png\" alt=\"ATP Rankings List Page\" width=\"168\" height=\"300\" srcset=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-Rankings-List-Page-168x300.png 168w, https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/ATP-Rankings-List-Page.png 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><\/p>\n<p><strong>STEP 8: View the test result<\/strong><br \/>\n<a href=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/RunTest1.png\" data-rel=\"lightbox-image-10\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1800\" src=\"https:\/\/qxf2.com\/blog\/wp-content\/uploads\/2014\/10\/RunTest1.png\" alt=\"BrowserStack Test Result\" width=\"670\" height=\"300\" \/><\/a><\/p>\n<hr \/>\n<p>Game. Set. Match. You learnt how to do mobile automation using Appium on a real device! If you are still hungry for more, take a tour of our open-sourced <a href=\"http:\/\/github.com\/qxf2\/qxf2-page-object-model\">web and mobile automation framework<\/a>.<\/p>\n<hr \/>\n<script>(function() {\n\twindow.mc4wp = window.mc4wp || {\n\t\tlisteners: [],\n\t\tforms: {\n\t\t\ton: function(evt, cb) {\n\t\t\t\twindow.mc4wp.listeners.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tevent   : evt,\n\t\t\t\t\t\tcallback: cb\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n})();\n<\/script><!-- Mailchimp for WordPress v4.10.1 - https:\/\/wordpress.org\/plugins\/mailchimp-for-wp\/ --><form id=\"mc4wp-form-1\" class=\"mc4wp-form mc4wp-form-6165 mc4wp-form-theme mc4wp-form-theme-blue\" method=\"post\" data-id=\"6165\" data-name=\"Newsletter\" ><div class=\"mc4wp-form-fields\"><div style=\"border:3px; border-style:dashed;border-color:#56d1e1;padding:1.2em;\">\r\n  <h1 style=\"text-align: center; padding-top: 20px; padding-bottom: 20px; color: #592b1b;\">Subscribe to our weekly Newsletter<\/h1>\r\n  <input style=\"margin: auto;\" type=\"email\" name=\"EMAIL\" placeholder=\"Your email address\" required \/>\r\n  <br>\r\n  <p style=\"text-align: center;\">\r\n    <input style=\"background-color: #890c06 !important; border-color: #890c06;\" type=\"submit\" value=\"Sign up\" \/>\r\n    \r\n  <\/p>\r\n  <p style=\"text-align: center;\">\r\n    <a href=\"http:\/\/mailchi.mp\/c9c7b81ddf13\/the-informed-testers-newsletter-20-oct-2017\"><small>View a sample<\/small><\/a>\r\n  <\/p>\r\n  <br>\r\n<\/div><\/div><label style=\"display: none !important;\">Leave this field empty if you're human: <input type=\"text\" name=\"_mc4wp_honeypot\" value=\"\" tabindex=\"-1\" autocomplete=\"off\" \/><\/label><input type=\"hidden\" name=\"_mc4wp_timestamp\" value=\"1776311916\" \/><input type=\"hidden\" name=\"_mc4wp_form_id\" value=\"6165\" \/><input type=\"hidden\" name=\"_mc4wp_form_element_id\" value=\"mc4wp-form-1\" \/><div class=\"mc4wp-response\"><\/div><\/form><!-- \/ Mailchimp for WordPress Plugin -->\n<hr \/>\n","protected":false},"excerpt":{"rendered":"<p>This Appium tutorial will show you how to run automated tests on a real physical device. We estimate skimming through this post will take you 10 minutes. We estimate working through this post, step by step, will take you about 90 minutes. In this post we will cover getting setup with Appium, interfacing with real devices, writing and running Appium [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,50,38,47,71,18,30,45],"tags":[],"class_list":["post-1676","post","type-post","status-publish","format-standard","hentry","category-android","category-appium","category-automation","category-mobile","category-mobile-automation","category-python","category-selenium","category-xpath"],"_links":{"self":[{"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/posts\/1676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/comments?post=1676"}],"version-history":[{"count":56,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/posts\/1676\/revisions"}],"predecessor-version":[{"id":11049,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/posts\/1676\/revisions\/11049"}],"wp:attachment":[{"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/media?parent=1676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/categories?post=1676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qxf2.com\/blog\/wp-json\/wp\/v2\/tags?post=1676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}