Как проверить содержание webelement в Python?

Я использую связку 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         + Вход успешный

добавьте в команду запуска теста флаг -s

3 лайка

Хорошая мысль - спасибо!

А-а-а-а. Спасибо большое! Блин, вот кто бы знал)))

    assert_equal(x, "1Подразделение: Отдел по работе с задолженностью (777-77)")
AssertionError: 'Подразделение: Отдел по работе с задолженностью (777-77)' != '1Подразделение: Отдел по работе с задолженностью (777-77)'
- Подразделение: Отдел по работе с задолженностью (777-77)
+ 1Подразделение: Отдел по работе с задолженностью (777-77)

Да, при помощи ключа -s в консоли появляется сравнение)

Вы же понимаете что тут так же концептуальный момент есть? Вы ищете элемент по тексту, а потом проверяете что у него есть этот текст.

Если у элемента искомого текста нет - он на странице не найдется, и вы получите NoSuchElementException и соответственно до проверки текста не дойдет.

А если элемент по такому тексту найдется - то и ваш assert всегда будет true.

Возможно у меня нет полной картины логики вашего приложения, но мысль думаю понятна.

1 лайк

Ну логика такая - я залогинился на странице входа. Ввел логин, пароль и нажал кнопку Войти. Затем меня перекинуло на страницу входа main.html.

Шаги для одного из сценариев мануального тестирования

  1. ввести верный логин user
  2. ввести верный пароль password
  3. нажать кнопку “Войти”
    Ожидаемый результат - вы вошли на страницу main.html под пользователем user.

А в автотесте надо ведь привязаться к какому-то результату, который отвечает ожидаемому результату. После удачного входа, в шапке сайта есть строка “Пользователь:” в который отображается имя пользователя под которым я зашел.

Вот я и подумал, что былоб хорошо если assert_equal проверял эту строку - если в ней написано “Пользователь: user”, то тест пройден. Если assert возвращает False (по любой причине, например сервер не отвечает и вход на страницу main.html не произошел) - то тест не пройден.

Может я просто не понял логику. Как вообще делать правильно проверки по окончанию теста? К чему привязываться?

В итоге у меня получилось

        self.driver.find_element(By.ID, "login_field").send_keys("user")
        self.driver.find_element(By.ID, "password_field").send_keys("password")
        self.driver.find_element(By.ID, "submit").click()
        x = self.driver.find_element(By.XPATH, "//*/span[contains(text(), 'Пользователь:')]").text
        print(x) #тут я получил строку Пользователь: user
        assert_equal(x, "Пользователь: user")

сразу быстрофикс -

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)

не используйте time.sleep , лучше используйте waituntill

WebDriverWait(driver, 10).until(lambda driver: driver.find_element(*locator).text)

А что это? и Что такое
self.driver.implicitly_wait(30)
и
self.driver.set_page_load_timeout(30)
и чем это отличается друг от друга?)))

WebDriverWait(driver, 10).until

Это не явное ожидание, которое ждет 10 сек, пока не найдется элемент:

driver.find_element(*locator).text

Если я не ошибаюсь, то self.driver.implicitly_wait(30) - ждет загрузки любого элемента, который вы ищете (текст, кнопку и т.д.) на протяжении этого времени, а set_page_load_timeout(30) ожидает полной загрузки страницы

Ок. Буду иметь ввиду. Спасибо вам за наводку)