Как передать аргументы тестовым функциям Selenium в Pytest?

Я хочу сделать свои тесты более гибкими. Например, у меня есть _test_login_, который может быть повторно использован с несколькими различными учетными данными для входа. Как я могу передать их в качестве аргументов вместо их жесткого кодирования?

Что у меня сейчас есть:

from selenium import webdriver
import pytest
def test_login():
    driver = webdriver.Chrome()
    driver.get("https://semantic-ui.com/examples/login.html")

    emailBox = driver.find_element_by_name("email")
    pwBox = driver.find_element_by_name("password")

    emailBox.send_keys("someLogin")
    pwBox.send_keys("somePW")

Как заменить строковые литералы в последних двух строках чем-то более гибким?

Я хочу иметь что-то вроде этого:

from selenium import webdriver
import pytest
def test_login(specifiedEmail, specifiedPW):
    driver = webdriver.Chrome()
    driver.get("https://semantic-ui.com/examples/login.html")

    emailBox = driver.find_element_by_name("email")
    pwBox = driver.find_element_by_name("password")

    emailBox.send_keys(specifiedEmail)
    pwBox.send_keys(specificedPW)

Не могли бы вы объяснить, как это сделать, вызвав скрипт как:

pytest main.py *specifiedEmail* *specifiedPW*

1 ответ

Решение

Попробуй использовать sys.arg,

import sys
for arg in sys.argv:
    print(arg)
print ("email:" + sys.argv[2])
print ("password:" + sys.argv[3])

Вот как будет выглядеть ваш код:

from selenium import webdriver
import pytest
import sys

def test_login(specifiedEmail, specifiedPW):
    driver = webdriver.Chrome()
    driver.get("https://semantic-ui.com/examples/login.html")

    emailBox = driver.find_element_by_name("email")
    pwBox = driver.find_element_by_name("password")

    emailBox.send_keys(sys.argv[2])
    pwBox.send_keys(sys.argv[3])

Другой способ добиться этого - использовать запрос в pytest.

def pytest_addoption(parser):
    parser.addoption("--email", action="store", default="myemail@email.com", help="Your email here")
    parser.addoption("--password", action="store", default="strongpassword", help="your password")



from selenium import webdriver
import pytest
def test_login(request):
    driver = webdriver.Chrome()
    driver.get("https://semantic-ui.com/examples/login.html")

    emailBox = driver.find_element_by_name("email")
    pwBox = driver.find_element_by_name("password")

    emailBox.send_keys(request.config.getoption("--email"))
    pwBox.send_keys(request.config.getoption("--password"))

В командной строке вы можете использовать -

pytest --email="email@gmail.com" --password="myPassword"
pytest --password="mysecondPassword" --email="email2@gmail.com"
pytest --email="email@gmail.com" 

Такой подход дает два преимущества.

  1. Команда более удобна для пользователя.
  2. Вы можете более удобно установить значение по умолчанию.
Другие вопросы по тегам