{ "info": { "author": "Daniel Ben-Zvi", "author_email": "daniel@doit9.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Testing" ], "description": "pyfrank - python binding for iOS automation using frank.\n========================================================\n\npyfrank is an API to interact with frank, the iOS automation framework.\n\nInstallation\n============\n\nOption 1:\n\n1. Clone this repo or download the sources\n\n2. ``cd pyfrank``\n\n3. ``python setup.py build``\n\n4. ``sudo python setup.py install``\n\nOption 2:\n\n``sudo pip install pyfrank``\n\n#It's that simple\n-----------------\n\n::\n\n from pyfrank import *\n\n # We are running a simulator with frank locally on port 32765\n device = Device(host='127.0.0.1', port=32765)\n\n # Get the view representing a tab-bar button with the label \"Mail\"\n view = device.getView(UiQuery(\"tabBarButton\", {'marked': \"Mail\" }))\n\n # Touch the button\n response = view.touch()\n\n if isinstance(response, Success):\n logging.info(\"Test mail button succeeded!\");\n elif isinstance(response, Failure):\n logging.error(\"Test mail button failed: %s\", response)\n\n#The object model\n-----------------\n\nDevice\n------\n\nThe first entry point for interacting with frank. It's constructor\nreceives the host and the port of the frank enabled device.\n\nExample:\n~~~~~~~~\n\n::\n\n from pyfrank import *\n\n device = Device(\"127.0.0.1\", 32765)\n\n # Type text into the keyboard\n device.typeIntoKeyboard(\"abc\")\n\n # Execute a method \n device.appExec(\"methodSignature\", \"arg1\", \"arg2\", ...)\n\n # Get the accesibility state\n accessibilityEnabled = device.accessibilityCheck()\n\n # Get the device orientation\n orientation = device.getOrientation()\n if orientation == Orientation.PORTRAIT:\n print \"Portrait\"\n elif orientation == Orientation.LANDSCAPE:\n print \"Landscape\"\n\n # Get the application layout graph\n dump = device.dump()\n\nUiQuery\n-------\n\nIn frank views can be found using a special query language called\n\"UiQuery\".\n\nExample:\n~~~~~~~~\n\n::\n\n from pyfrank import *\n\n UiQuery(\"view:'UIImageView' marked:'ProfilePicture'\")\n\n- Additional documentation on UiQuery can be found here:\n http://code.google.com/p/uispec/wiki/Documentation#UIQuery\n\nView\n----\n\nView allows to perform operations on the view(s) that match a UiQuery.\n\n::\n\n #Get the profile picture view\n view = device.getView(UiQuery({'view': 'UIImageView'}, {'marked': 'ProfilePicture'}))\n\n #Flash the profile picture\n r = view.flash() \n\n #Test for success\n if isinstance(r, Success):\n print \"Flashed the profile picture!\"\n else:\n print \"Failed flashing profile picture\"\n\n #Touch the profile picture\n r = view.touch()\n\n\n #Get the title text input view\n input = device.getView(UiQuery({'view', 'UITextField'}, {'marked': 'Title'}))\n\n r = input.setText(\"New title text\") \n\n if isinstance(r, Success):\n print \"Title input was changed successfully.\"\n else:\n print \"Failed changing title input\"\n\nRetrieve a view property\n------------------------\n\n::\n\n view = device.getView(UiQuery({'view':'UILabel'}, { 'marked':'Pull down to refresh...' }))\n\n # \n # Pull out the 'text' attribute.\n r = view.text()\n\n if isinstance(r, Success):\n labelText = r['results'][0]\n\n print \"The text of the UILabel is\", labelText\n else:\n print \"I seriously failed to retrieve the UILabel text attribute\", r\n\nTake a screenshot\n-----------------\n\n::\n\n device.screenshot(fileName='snapshot.jpg')\n\nRun javascript code inside a WebView\n------------------------------------\n\n::\n\n view = device.getView(UiQuery('webView', { 'index':0 }))\n\n # Fetch the URL from JS\n url = view.stringByEvaluatingJavaScriptFromString('location.href').results()[0]\n print \"URL:\", url\n\n # Pop up an alert box\n view.stringByEvaluatingJavaScriptFromString(\"alert('Hello from pyfrank!')\")\n\n#More information on frank\n--------------------------\n\nhttp://testingwithfrank.com/", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/everythingme/pyfrank", "keywords": "python frank pyfrank frankly ios qa automation robot testing", "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "pyfrank", "package_url": "https://pypi.org/project/pyfrank/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pyfrank/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/everythingme/pyfrank" }, "release_url": "https://pypi.org/project/pyfrank/0.2.8/", "requires_dist": null, "requires_python": null, "summary": "python binding for iOS automation using frank.", "version": "0.2.8" }, "last_serial": 797224, "releases": { "0.2.1": [ { "comment_text": "", "digests": { "md5": "74566ea0d49bc97466f61c385740f0c9", "sha256": "58df0fe894e7d10534796db5d973811c759b18dc389be36a94af858ab1370497" }, "downloads": -1, "filename": "pyfrank-0.2.1.tar.gz", "has_sig": false, "md5_digest": "74566ea0d49bc97466f61c385740f0c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7507, "upload_time": "2012-10-04T14:59:58", "url": "https://files.pythonhosted.org/packages/14/3a/1b61091cb568395629132b0df5ea6c00544cf5781d866df3758aa3f80a7a/pyfrank-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "a0becbdd01217adafd5f4c89e0894d9a", "sha256": "e990807dbd731566380e1d67cdddb92137b20e97cd7c76fa5259ce0b5246f61f" }, "downloads": -1, "filename": "pyfrank-0.2.2.tar.gz", "has_sig": false, "md5_digest": "a0becbdd01217adafd5f4c89e0894d9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8075, "upload_time": "2012-10-10T13:05:31", "url": "https://files.pythonhosted.org/packages/f6/8c/376e98d3eae1cc2b5a2b45e227757d05aaf11336f7a0dfdb84cf71cfd60f/pyfrank-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "920e210dfa39520848cea796aa561701", "sha256": "1dec1e7c9ffaeb1f7c35d5b6ee8a0a24a868ce439767f35a2bc1d9783d10b277" }, "downloads": -1, "filename": "pyfrank-0.2.3.tar.gz", "has_sig": false, "md5_digest": "920e210dfa39520848cea796aa561701", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8422, "upload_time": "2012-10-10T13:40:57", "url": "https://files.pythonhosted.org/packages/68/99/6fe15c9caaa38974224f1c1718cd48ffa1e1beecc63abadd2186d14df830/pyfrank-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "b10cafd85d5e1f1af0a4d2c908ee81c9", "sha256": "26f2de2ef1e08e31661214df436a025ab1c3ae645402f468162da0573b08d4af" }, "downloads": -1, "filename": "pyfrank-0.2.4.tar.gz", "has_sig": false, "md5_digest": "b10cafd85d5e1f1af0a4d2c908ee81c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8425, "upload_time": "2012-10-10T14:52:31", "url": "https://files.pythonhosted.org/packages/2c/95/0c460a258222926ae1bfde26a899fba4a568e735b546726e338e5e3018a5/pyfrank-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "ed4d1454d789497290ec8f714f0fe683", "sha256": "eb8a7b45cf77826f6d1fc24448849adf93610e55ebd08cc36fad802d6bd88982" }, "downloads": -1, "filename": "pyfrank-0.2.5.tar.gz", "has_sig": false, "md5_digest": "ed4d1454d789497290ec8f714f0fe683", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8541, "upload_time": "2012-10-11T12:30:19", "url": "https://files.pythonhosted.org/packages/18/b0/2fa5da0b8694d8bdbf984eab7363eec53e4761bf47e7f3d4050fbf0e30fe/pyfrank-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "77a538afc2b375f916ab0b96fcda909b", "sha256": "e457fbdc3215a980b1bde45f2840e833628b2b5079273e66acabf58c571c1ca0" }, "downloads": -1, "filename": "pyfrank-0.2.6.tar.gz", "has_sig": false, "md5_digest": "77a538afc2b375f916ab0b96fcda909b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9034, "upload_time": "2012-10-17T09:14:46", "url": "https://files.pythonhosted.org/packages/ad/9b/3bbef49803a36b82ca9ba592abf8a8af1045fe31f3836b6b71d15149bddd/pyfrank-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "7a7511d57a25bb72f81ca63e509773d8", "sha256": "46a7f0c03bf3cc2e94835356dead120e0daa8b59f507d32ae9e193fcfee7e648" }, "downloads": -1, "filename": "pyfrank-0.2.7.tar.gz", "has_sig": false, "md5_digest": "7a7511d57a25bb72f81ca63e509773d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9642, "upload_time": "2012-10-17T14:16:03", "url": "https://files.pythonhosted.org/packages/2c/7e/805ee306483d6cb581690af47cf11539a75c625919b34fdbc56e6ae8f022/pyfrank-0.2.7.tar.gz" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "de91ee5557cb006664ea46adac2b79e9", "sha256": "8bf3a0369f81b357cfef8c56520a7d4cb4e8f245c4d96e3c2dc61048ae7f71e6" }, "downloads": -1, "filename": "pyfrank-0.2.8.tar.gz", "has_sig": false, "md5_digest": "de91ee5557cb006664ea46adac2b79e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9930, "upload_time": "2012-10-25T15:40:39", "url": "https://files.pythonhosted.org/packages/66/04/fe721dd2d75be2d4a1d8aecb316f21109e1cd37296ba93461d55151a1c03/pyfrank-0.2.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "de91ee5557cb006664ea46adac2b79e9", "sha256": "8bf3a0369f81b357cfef8c56520a7d4cb4e8f245c4d96e3c2dc61048ae7f71e6" }, "downloads": -1, "filename": "pyfrank-0.2.8.tar.gz", "has_sig": false, "md5_digest": "de91ee5557cb006664ea46adac2b79e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9930, "upload_time": "2012-10-25T15:40:39", "url": "https://files.pythonhosted.org/packages/66/04/fe721dd2d75be2d4a1d8aecb316f21109e1cd37296ba93461d55151a1c03/pyfrank-0.2.8.tar.gz" } ] }