Я использую связку nosetests и webdriver. Допустим мне надо получить текстовое значение из тега и сделать assert с имеющимся значением - это будет означать, что тест пройден.
Проблема заключается в том, помимо того что я новичок, что я не могу проверить значение, которое передаю переменной. Я пытаюсь вывести его на экран при помощи функции print, но если запускаю файл через pycharm или консоль, то он просто не выполняется, а если запускаю через nosetest, то в консоли не отображается функция print.
Объясню на примере.
import unittest
from nose.tools import assert_equal, assert_true
from selenium import webdriver
from selenium.webdriver.common.by import By
class SampleTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def first_test(self, ):
self.driver.get("http://xxx.ru")
x = self.driver.find_element(By.XPATH, "//*/div[contains(text(), 'Какой-то текст'")].text()
print(x) #я просто хочу проверить, что при помощи функции text() я реально взял какой-то текст.
assert_true(x, "какой-то текст") #делаю проверку содержимого xpath и моего ожидаемого результата.
Вопрос в том, как мне получить print. Я хочу увидеть, что я передал переменной. Интерпретатор не хочет запускать файл. А nosetests в консоли ничего не отображает, кроме как
Напечатайте или вставьте сюда код.
----------------------------------------------------------------------
Ran 1 test in 27.074s
OK
Сделай тут assert_true(x, “какой-то текст”) заведомо несовпадающие значения, например допиши в “какой-то текст тра-ля-ля”, и потом посмотри какая ошибка будет, в ней будет видно чем является переменная x.
Например py.test-овский assert: assert 'Вход успешный test' == success_login_message.text
выдаёт:
E AssertionError: assert 'Вход успешный test' == 'Вход успешный'
E - Вход успешный test
E ? -
E + Вход успешный
assert_equal(x, "1Подразделение: Отдел по работе с задолженностью (777-77)")
AssertionError: 'Подразделение: Отдел по работе с задолженностью (777-77)' != '1Подразделение: Отдел по работе с задолженностью (777-77)'
- Подразделение: Отдел по работе с задолженностью (777-77)
+ 1Подразделение: Отдел по работе с задолженностью (777-77)
Да, при помощи ключа -s в консоли появляется сравнение)
Ну логика такая - я залогинился на странице входа. Ввел логин, пароль и нажал кнопку Войти. Затем меня перекинуло на страницу входа main.html.
Шаги для одного из сценариев мануального тестирования
ввести верный логин user
ввести верный пароль password
нажать кнопку “Войти”
Ожидаемый результат - вы вошли на страницу main.html под пользователем user.
А в автотесте надо ведь привязаться к какому-то результату, который отвечает ожидаемому результату. После удачного входа, в шапке сайта есть строка “Пользователь:” в который отображается имя пользователя под которым я зашел.
Вот я и подумал, что былоб хорошо если assert_equal проверял эту строку - если в ней написано “Пользователь: user”, то тест пройден. Если assert возвращает False (по любой причине, например сервер не отвечает и вход на страницу main.html не произошел) - то тест не пройден.
Может я просто не понял логику. Как вообще делать правильно проверки по окончанию теста? К чему привязываться?
username = "user"
password = "password"
self.driver.find_element(By.ID, "login_field").send_keys(username)
self.driver.find_element(By.ID, "password_field").send_keys(password)
self.driver.find_element(By.ID, "submit").click()
# Так же здесь скорее всего нужно будет добавить ожидание после клика. Не думаю что логин происходит мгновенно
welcomeUserText = self.driver.find_element(By.XPATH, "//*/span[contains(text(), 'Пользователь:')]").text
print(welcomeUserText) #тут я получил строку Пользователь: user
assert_equal(welcomeUserText, "Пользователь: " + username)
О-о-о-о ну это уже круто и продвинуто) я пока пониже уровнем. Тогда я так понимаю, можно и xpath тоже присвоить к переменным. Да и вообще разнести тесты и страницы. Я такое видел. Типа описываешь все нужные элементы на странице, а потом в тестах просто вызываешь эти элементы и из-за этого тесты коротенькие, понятные и удобные.
Но все равно спасибо - буду стараться делать именно так. А задержки я использую, просто писать не стал. Я использую time.sleep(5)
Это не явное ожидание, которое ждет 10 сек, пока не найдется элемент:
driver.find_element(*locator).text
Если я не ошибаюсь, то self.driver.implicitly_wait(30) - ждет загрузки любого элемента, который вы ищете (текст, кнопку и т.д.) на протяжении этого времени, а set_page_load_timeout(30) ожидает полной загрузки страницы