J'ai un fichier conftest pour gérer la configuration et le démontage des pilotes de sélénium lors de l'exécution de tests dans pytest. J'essaye d'ajouter dans une option de ligne de commande pour déterminer si j'exécute le local a sélénium intégré et les conducteurs de Web ou un serveur de sélenium à distance et des conducteurs etc ...Comment accéder à l'entrée de la ligne de commande dans pytest conftest à partir de pytest_addoptions et l'utiliser dans les paramètres de fixture?
J'ai ajouté une option commandline appelée "runenv" et j'essaye d'obtenir la valeur de chaîne de ceci entrée par la ligne de commande pour déterminer si le système devrait exécuter la configuration de webdriver locale ou distante. Cela permet aux testeurs de développer localement leurs propres machines, mais cela signifie également que nous pouvons programmer les tests pour qu'ils s'exécutent sur la machine distante dans le cadre d'un pipeline de build.
Le problème que j'ai, c'est que mon parser.addoption montré dans le fichier ci-dessous n'est pas traité. Il ne semble pas renvoyer une valeur (que ce soit la valeur par défaut ou la valeur transmise par la ligne de commande) que je peux utiliser.
Mon fichier conftest.py est la suivante (* Notez l'URL et IP à distance ne sont que des échantillons pour couvrir la vie privée de l'entreprise)
#conftest.py
import pytest
import os
import rootdir_ref
import webdriverwrapper
from webdriverwrapper import DesiredCapabilities, FirefoxProfile
#when running tests from command line we should be able to pass --url=www..... for a different website, check what order these definitions need to be in
def pytest_addoption(parser):
parser.addoption("--url", action="store", default="https://mydomain1.com.au")
parser.addoption("--runenv", action="store", default="local")
@pytest.fixture(scope='session')
def url(request):
return request.config.option.url
@pytest.fixture(scope='session')
def runenv(request):
return request.config.option.runenv
BROWSERS = {}
if runenv == 'remote':
BROWSERS = {'chrome_remote': DesiredCapabilities.CHROME}
else:
BROWSERS = {'chrome': DesiredCapabilities.CHROME}
# BROWSERS = {
# #'firefox': DesiredCapabilities.FIREFOX,
# # 'chrome': DesiredCapabilities.CHROME,
# 'chrome_remote': DesiredCapabilities.CHROME,
# # 'firefox_remote': DesiredCapabilities.FIREFOX
# }
@pytest.fixture(scope='function', params=BROWSERS.keys())
def browser(request):
if request.param == 'firefox':
firefox_capabilities = BROWSERS[request.param]
firefox_capabilities['marionette'] = True
firefox_capabilities['acceptInsecureCerts'] = True
theRootDir = os.path.dirname(rootdir_ref.__file__)
ffProfilePath = os.path.join(theRootDir, 'DriversAndTools', 'FirefoxSeleniumProfile')
geckoDriverPath = os.path.join(theRootDir, 'DriversAndTools', 'geckodriver.exe')
profile = FirefoxProfile(profile_directory=ffProfilePath)
# Testing with local Firefox Beta 56
binary = 'C:\\Program Files\\Mozilla Firefox\\firefox.exe'
b = webdriverwrapper.Firefox(firefox_binary=binary, firefox_profile=profile, capabilities=firefox_capabilities,
executable_path=geckoDriverPath)
elif request.param == 'chrome':
desired_cap = BROWSERS[request.param]
desired_cap['chromeOptions'] = {}
desired_cap['chromeOptions']['args'] = ['--disable-plugins', '--disable-extensions']
desired_cap['browserName'] = 'chrome'
desired_cap['javascriptEnabled'] = True
theRootDir = os.path.dirname(rootdir_ref.__file__)
chromeDriverPath = os.path.join(theRootDir, 'DriversAndTools', 'chromedriver.exe')
b = webdriverwrapper.Chrome(chromeDriverPath, desired_capabilities=desired_cap)
elif request.param == 'chrome_remote':
desired_cap = BROWSERS[request.param]
desired_cap['chromeOptions'] = {}
desired_cap['chromeOptions']['args'] = ['--disable-plugins', '--disable-extensions']
desired_cap['browserName'] = 'chrome'
desired_cap['javascriptEnabled'] = True
b = webdriverwrapper.Remote(command_executor='http://192.168.1.1:4444/wd/hub', desired_capabilities=desired_cap)
elif request.param == 'firefox_remote':
firefox_capabilities = BROWSERS[request.param]
firefox_capabilities['marionette'] = True
firefox_capabilities['acceptInsecureCerts'] = True
firefox_capabilities['browserName'] = 'firefox'
firefox_capabilities['javascriptEnabled'] = True
theRootDir = os.path.dirname(rootdir_ref.__file__)
ffProfilePath = os.path.join(theRootDir, 'DriversAndTools', 'FirefoxSeleniumProfile')
profile = FirefoxProfile(profile_directory=ffProfilePath)
b = webdriverwrapper.Remote(command_executor='http://192.168.1.1:4444/wd/hub',
desired_capabilities=firefox_capabilities, browser_profile=profile)
else:
b = BROWSERS[request.param]()
request.addfinalizer(lambda *args: b.quit())
return b
@pytest.fixture(scope='function')
def driver(browser, url):
driver = browser
driver.set_window_size(1260, 1080)
driver.get(url)
return driver
Mes tests serait tout simplement utiliser le résultat de projecteur « pilote » Une fois la page déjà été installé par conftest. test Exemple peut-être:
import pytest
from testtools import login, dashboard, calendar_helper, csvreadtool, credentials_helper
import time
@pytest.mark.usefixtures("driver")
def test_new_appointment(driver):
testId = 'Calendar01'
credentials_list = credentials_helper.get_csv_data('LoginDetails.csv', testId)
# login
assert driver.title == 'Patient Management cloud solution'
rslt = login.login_user(driver, credentials_list)
.... etc..
J'aimerais ensuite lancer la suite de test à l'aide d'une commande comme:. python -m pytest -v --html = \ Résultats \ testrunX.html --self-contained- html --url = https://myotherdomain.com.au/ --runenv = chrome_remote
Jusqu'à présent, l'option de ligne de commande url fonctionne, je peux l'utiliser pour remplacer l'URL ou la laisser utiliser la valeur par défaut.
Mais je ne peux pas obtenir une valeur de l'option de ligne de commande runenv. Dans l'instruction if ci-dessous, elle sera toujours par défaut à l'instruction else. runenv ne semble pas avoir une valeur, même si la valeur par défaut que j'ai pour que parser.addoption est « local »
if runenv == 'remote':
BROWSERS = {'chrome_remote': DesiredCapabilities.CHROME}
else:
BROWSERS = {'chrome': DesiredCapabilities.CHROME}
J'ai essayé de mettre en pdb.trace() avant l'instruction if que je puisse voir ce que est dans le runenv, mais il me dira seulement que c'est une fonction et je ne semble pas pouvoir en obtenir une valeur, ce qui me fait penser que ça ne se remplit pas du tout.
Je ne suis pas vraiment sûr comment déboguer le fichier conftest parce que la sortie n'apparaît généralement pas dans la sortie de la console. Aucune suggestion? Est-ce que pytest_addoption accepte réellement 2 arguments de ligne de commande personnalisés ou plus?
J'utilise Python 3.5.3 Pytest 3.2.1 Dans un virtualenv sur les fenêtres 10
Merci @Chanda c'est génial !. Merci beaucoup. Je vais essayer dès que j'ai une chance. – Roochiedoor
Cette réponse était exactement ce dont j'avais besoin. Merci beaucoup. – Roochiedoor