Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема с assert'ами при прохождении тестов


(Alexey) #1

В тестах имеется следующие 2 строчки

        locator.send_keys(text)
        assert locator.get_attribute('value') == text

но периодически, в логах появляется такая ошибка

AssertionError: (assertion failed, but when it was re-run for printing intermediate values, it did not fail.  Suggestions: compute assert expression before the assert or use --assert=plain)

Подскажите, пожалуйста, как можно решить проблему? Где у меня ошибка?

seleneium 2.53.6
pytest 3.0.1
chrome-driver 2.23

(Artur Korobeynyk) #2

Ошибка в понимании работы селениума и питест.
Я даже не думал, что в нём ассерты настолько “для ленивых”, даже указывают чего чинить надо.

        locator.send_keys(text)
        actual = locator.get_attribute('value')
        assert actual == text

При длинных текстах локатор не успевает возвратить всю строку до того как сработает ассерт (возможно локатор работает йелдами), по-этому работаем с локатором до того как начнем работать с асертом.

Причина №2, текст не успевает пройти через драйвер и попасть на страничку, так что и локатор его не найдет. Так что понадобится что-то вроде

WebDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath")));

(Alexey) #3
        locator.send_keys(text)
        actual = locator.get_attribute('value')
        assert actual == text

К сожалению, этот способ не помог.

Кроме как, через

WebDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath")))

других способов нет, насколько я понимаю.


(Pavel Ponomaryov) #4

Попробуйте дождаться пока ожидаемый текст туда вставится. Он же не за миллисекунду появляется. Потом уже берите атрибут ‘value’


(Alexey) #5

Как правильно сделать это ожидание? Не через sleep же его вкорячивать :neutral_face:


(Maxim Zaitsev) #6

В ExpectedConditions есть такой condition:
text_to_be_present_in_element_value


(Alexey) #7

Что-то у меня какие-то невнятные проблемы.

WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value((By.NAME, "name"), "text"))

но в итоге получаю ошибку

selenium.common.exceptions.WebDriverException: Message: unknown error: 'value' must be a string

(Maxim Zaitsev) #8

Что-то не так с параметром value xD. Надо разбираться.
На на сайте яндекса - без ошибок:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver = webdriver.Firefox()
driver.get('http://yandex.ru')
input_fld = driver.find_element_by_xpath('//input[@name="text"]')
input_fld.clear()
input_fld.send_keys('selenium')

try:
    WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value((By.XPATH, '//input[@name="text"]'), 'selenium'))   
except TimeoutException:
    print('timeout :(')