mirror of
https://github.com/appium/appium.git
synced 2026-01-14 06:10:01 -06:00
134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
"""An example of Appium running on Sauce using Sauce Connect to access a local webserver.
|
|
|
|
This test assumes SAUCE_USERNAME and SAUCE_ACCESS_KEY are environment variables
|
|
set to your Sauce Labs username and access key.
|
|
|
|
You'll also need Sauce-Connect.jar in this test directory so we can start it to enable
|
|
a tunnel between Sauce Labs and your machine
|
|
|
|
This is an All-In-One bundle test that does a lot more than usual test would. It does following
|
|
things that you would normally do in a different way:
|
|
- starts Sauce Connect - which you would normally start from console with
|
|
"java -jar Sauce-Connect.jar SAUCE_USERNAME SAUCE_ACCESS_KEY"
|
|
- starts a local webserver on port 9999 that serves a sample string - normally you would
|
|
like to connect to your own webserver
|
|
"""
|
|
|
|
import unittest
|
|
from selenium import webdriver
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import select
|
|
from SimpleHTTPServer import SimpleHTTPRequestHandler
|
|
from StringIO import StringIO
|
|
from threading import Thread
|
|
from BaseHTTPServer import HTTPServer
|
|
from SocketServer import ThreadingMixIn
|
|
|
|
|
|
SAUCE_USERNAME = os.environ.get('SAUCE_USERNAME')
|
|
SAUCE_ACCESS_KEY = os.environ.get('SAUCE_ACCESS_KEY')
|
|
|
|
|
|
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
|
|
"""Handle requests in a separate thread."""
|
|
|
|
|
|
class MyRequestHandler(SimpleHTTPRequestHandler):
|
|
"""Serve a sample HTML page so we can check if test works properly"""
|
|
def do_GET(self):
|
|
f = StringIO()
|
|
f.write("<html><body>Welcome to the flipside!</body></html>")
|
|
f.seek(0)
|
|
|
|
#send code 200 response
|
|
self.send_response(200)
|
|
|
|
#send header first
|
|
self.send_header('Content-type', 'text-html')
|
|
self.end_headers()
|
|
|
|
#send file content to client
|
|
self.wfile.write(f.read())
|
|
f.close()
|
|
return
|
|
|
|
|
|
class Selenium2OnSauce(unittest.TestCase):
|
|
|
|
def setUpWebServer(self):
|
|
# Setting up a local websever in separate thread on port 9999
|
|
httpd = ThreadedHTTPServer(("", 9999), MyRequestHandler)
|
|
sa = httpd.socket.getsockname()
|
|
print "[HTTP Server] Serving HTTP on", sa[0], "port", sa[1], "..."
|
|
thread = Thread(target=httpd.serve_forever)
|
|
thread.daemon = True # so server gets killed when we exit
|
|
thread.start()
|
|
|
|
def setUpTunnel(self):
|
|
# Setting up Sauce Connect tunnel
|
|
self.process = subprocess.Popen(["java -jar Sauce-Connect.jar %s %s" % (SAUCE_USERNAME, SAUCE_ACCESS_KEY)], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
p = self.process
|
|
print "[Sauce Connect]: Waiting for tunnel setup, this make take up to 30s"
|
|
is_ready = False
|
|
while True:
|
|
reads = [p.stdout.fileno(), p.stderr.fileno()]
|
|
ret = select.select(reads, [], [])
|
|
|
|
for fd in ret[0]:
|
|
if fd == p.stdout.fileno():
|
|
read = p.stdout.readline()
|
|
sys.stdout.write("[Sauce Connect]: %s" % read)
|
|
|
|
if "Connected! You may start your tests." in read:
|
|
print "[Sauce Connect]: Tunnel ready, running the test"
|
|
is_ready = True
|
|
break
|
|
|
|
if fd == p.stderr.fileno():
|
|
read = p.stderr.readline()
|
|
sys.stderr.write("[Sauce Connect]: %s" % read)
|
|
if "Unable to access jarfile" in read:
|
|
self.process.terminate()
|
|
raise Exception("Sauce Connect could not start!")
|
|
|
|
if is_ready:
|
|
break
|
|
|
|
def setUp(self):
|
|
self.setUpWebServer()
|
|
self.setUpTunnel()
|
|
|
|
desired_capabilities={
|
|
'browserName': '',
|
|
'platformName': 'Android',
|
|
'deviceName': 'iPhone Simulator',
|
|
'platformVersion': '6.1',
|
|
'app': app,
|
|
'name': 'Appium Python iOS Test (Connect)'
|
|
})
|
|
|
|
self.driver = webdriver.Remote(
|
|
desired_capabilities=caps,
|
|
command_executor="http://%s:%s@ondemand.saucelabs.com:80/wd/hub" % (SAUCE_USERNAME, SAUCE_ACCESS_KEY)
|
|
)
|
|
self.driver.implicitly_wait(30)
|
|
|
|
def test_basic(self):
|
|
driver = self.driver
|
|
driver.get("http://127.0.0.1:9999/")
|
|
body = self.driver.find_element_by_tag_name("body")
|
|
self.assertTrue("Welcome to the flipside!" in body.text)
|
|
|
|
def tearDown(self):
|
|
print("Link to your job: https://saucelabs.com/jobs/%s" % self.driver.session_id)
|
|
self.driver.quit()
|
|
self.process.terminate()
|
|
|
|
if __name__ == '__main__':
|
|
if not (SAUCE_USERNAME and SAUCE_ACCESS_KEY):
|
|
print "Make sure you have SAUCE_USERNAME and SAUCE_ACCESS_KEY set as environment variables."
|
|
else:
|
|
unittest.main()
|