将命令行参数传递给selenium python webdriver测试用例

时间:2014-06-19 07:22:58

标签: python-2.7 selenium selenium-webdriver

以下代码是使用selenium python web驱动程序编写的,它运行在saucelabs中。我在列表中提供浏览器名称,版本和平台,如何通过命令行参数提供浏览器详细信息?我正在使用py.test来执行测试用例。

import os
import sys
import httplib
import base64
import json
import new
import unittest
import sauceclient
from selenium import webdriver
from sauceclient import SauceClient

# it's best to remove the hardcoded defaults and always get these values
# from environment variables
USERNAME = os.environ.get('SAUCE_USERNAME', "ranjanprabhub")
ACCESS_KEY = os.environ.get('SAUCE_ACCESS_KEY', "ecec4dd0-d8da-49b9-b719-17e2c43d0165")
sauce = SauceClient(USERNAME, ACCESS_KEY)

browsers = [{"platform": "Mac OS X 10.9",
             "browserName": "chrome",
             "version": ""},
           ]


def on_platforms(platforms):
    def decorator(base_class):
        module = sys.modules[base_class.__module__].__dict__
        for i, platform in enumerate(platforms):
            d = dict(base_class.__dict__)
            d['desired_capabilities'] = platform
            name = "%s_%s" % (base_class.__name__, i + 1)
            module[name] = new.classobj(name, (base_class,), d)
    return decorator


@on_platforms(browsers)
class SauceSampleTest(unittest.TestCase):
    def setUp(self):
        self.desired_capabilities['name'] = self.id()

        sauce_url = "http://%s:%s@ondemand.saucelabs.com:80/wd/hub"
        self.driver = webdriver.Remote(
            desired_capabilities=self.desired_capabilities,
            command_executor=sauce_url % (USERNAME, ACCESS_KEY)
        )
        self.driver.implicitly_wait(30)

    def test_sauce(self):
        self.driver.get('http://saucelabs.com/test/guinea-pig')
        assert "I am a page title - Sauce Labs" in self.driver.title
        comments = self.driver.find_element_by_id('comments')
        comments.send_keys('Hello! I am some example comments.'
                           ' I should be in the page after submitting the form')
        self.driver.find_element_by_id('submit').click()

        commented = self.driver.find_element_by_id('your_comments')
        assert ('Your comments: Hello! I am some example comments.'
                ' I should be in the page after submitting the form'
                in commented.text)
        body = self.driver.find_element_by_xpath('//body')
        assert 'I am some other page content' not in body.text
        self.driver.find_elements_by_link_text('i am a link')[0].click()
        body = self.driver.find_element_by_xpath('//body')
        assert 'I am some other page content' in body.text

    def tearDown(self):
        print("Link to your job: https://saucelabs.com/jobs/%s" % self.driver.session_id)
        try:
            if sys.exc_info() == (None, None, None):
                sauce.jobs.update_job(self.driver.session_id, passed=True)
            else:
                sauce.jobs.update_job(self.driver.session_id, passed=False)
        finally:
            self.driver.quit()

1 个答案:

答案 0 :(得分:2)

所以这有点复杂,因为你可以将一组浏览器传递给@on_platforms装饰器。我的解决方案适用于单个浏览器,因为它看起来就像您现在所做的那样。


对于当前的单一浏览器,情况 - 您正在寻找 argparse 。这是我建议的解决方法:

import argparse

def setup_parser():
    parser = argparse.ArgumentParser(description='Automation Testing!')
    parser.add_argument('-p', '--platform', help='Platform for desired_caps', default='Mac OS X 10.9')    
    parser.add_argument('-b', '--browser-name', help='Browser Name for desired_caps', default='chrome')
    parser.add_argument('-v', '--version', default='')

    args = vars(parser.parse_args())

    return args

desired_caps = setup_parser()
browsers = [desired_caps]
print browsers

但是,如果您正在寻找测试多个浏览器(我建议您这样做),您不应该尝试为每个浏览器的desired_caps使用命令行参数即可。您应该为浏览器加载一个json配置文件,为每个要运行Sauce的那个加载desired_caps。

为每组浏览器设置一个不同的配置文件,然后使用命令行参数传入要加载的配置文件。