Forum Testowania i AutomatyzacjiKategoria: PytanieAssertionError ‘Demobank – Bankowość Internetowa – Konta’
AvatarKamil zapytał 5 lat temu

Cześć,
Mam problem z porównaniem tytułu strony poprzez: assert.

driver.get('https://demobank.jaktestowac.pl/konta.html')
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title = driver.title
assert 'Demobank - Bankowość Internetowa - Logowanie' == title
assert 'Demobank – Bankowość Internetowa – Konta' == title

W obu przypadkach test startuje, uruchamia się przeglądarka – ładuje odpowiednią stronę po czym dostaję
komunikat: assert ‘Demobank – Bankowość Internetowa – Konta’ == title
AssertionError.
Proszę o pomoc.

3 odpowiedzi
Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

W przypadku tego kodu wszystko się zgadza 😉
Najpierw otwierana jest strona z kontem, później strona z logowaniem. Ze strony z logowaniem odczytywany jest tytuł (który ląduje w zmiennej title). Teraz pierwsza asercja się powiedzie, bo w zmiennej title jest tytuł strony logowania, natomiast asercja z ‘Demobank – Bankowość Internetowa – Konta’ już nie. Po prostu za duzo jest odczytywane i sprawdzane na raz 🙂

Poniższy kod zadziała:

driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title = driver.title
assert 'Demobank - Bankowość Internetowa - Logowanie' == title

driver.get('https://demobank.jaktestowac.pl/konta.html')
title = driver.title
assert 'Demobank – Bankowość Internetowa – Konta' == title

Dodatkowo dobrym pomysłem jest dodanie do asercji dodatkowej informacji, która zostanie wyświetlona w przypadku błędu:

driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title = driver.title
assert 'Demobank - Bankowość Internetowa - Logowanie' == title, f'Actual page title: {title}'

lub można dorzucić prosty print aby sprawdzić co przechowuje dana zmienna:

driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title = driver.title
print('The title for first assertion:')
print(title)
assert 'Demobank - Bankowość Internetowa - Logowanie' == title

driver.get('https://demobank.jaktestowac.pl/konta.html')
title = driver.title
print('The title for second assertion:')
print(title)
assert 'Demobank – Bankowość Internetowa – Konta' == title

Daj znać czy to pomogło 🙂

Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Zakładam, ze spodziewamy się, ze test przejdzie, ale niestety dzieje się inaczej 😉

Pierwsza rzecz, jaka mi się nasunęła to, że jest coś nie tak z formatowaniem znaku “-” – możliwe, ze zawiodło przyklejanie tutaj na forum. Gdy odpaliłem ten fragment kodu i porównałem wyświetlony tytuł z oczekiwanym, to okazało się, ze znak “-” znakowi “–” nie równy 😀 Na stronie występuje https://www.thepunctuationguide.com/hyphen.html, natomiast my oczekujemy https://www.thepunctuationguide.com/en-dash.html .

Porównaj proszę u siebie tytuły i napisz czy to ten problem 😉

AvatarKamil odpowiedział 5 lat temu

Witam,
Tak to jest jak człowiek się spieszy 🙂
Wrzuciłem bezsensu pomieszany kod. Chodziło mi o dwa powyższe przypadki dla których dostaję ten sam błąd.
Tzn mój skrypt wygląda tak:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Lekcja z tytułem strony:
from selenium import webdriver

driver = webdriver.Chrome (‘F:\Kamil\chromedriver\chromedriver’)
driver.get(‘https://demobank.jaktestowac.pl/logowanie_etap_1.html’)
title=driver.title
print(title)
assert ‘Demobank – Bankowość Internetowa – Logowanie’ == title
driver.quit()

W odpowiedzi dostaję:

C:\Python27\python.exe C:/Users/Komputer/PycharmProjects/Testy/JakTestowac.py
C:/Users/Komputer/PycharmProjects/Testy/JakTestowac.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
Demobank – Bankowość Internetowa – Logowanie
assert ‘Demobank – Bankowość Internetowa – Logowanie’ == title
Traceback (most recent call last):
File “C:/Users/Komputer/PycharmProjects/Testy/JakTestowac.py”, line 10, in
assert ‘Demobank – Bankowość Internetowa – Logowanie’ == title
AssertionError

To dotyczy wszystkich tytułów dla których wykonywałem aserację. To samo dzieję się po uruchomieniu kodu od Ciebie.

Przemek BarańskiPrzemek Barański Personel odpowiedział 5 lat temu

Na szybko – dodaj u przed stringiem oczekiwanym czyli u'Demobank – Bankowość Internetowa – Logowanie' i zadziała 😀
Dlaczego?
Dla kodu:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Lekcja z tytułem strony:
from selenium import webdriver

driver = webdriver.Chrome ('F:\Kamil\chromedriver\chromedriver')
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title=driver.title
print(title)
assert 'Demobank – Bankowość Internetowa – Logowanie' == title
driver.quit()

i błędu

Testy/JakTestowac.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
Demobank – Bankowość Internetowa – Logowanie
assert 'Demobank – Bankowość Internetowa – Logowanie' == title
Traceback (most recent call last):
File 'C:/Users/Komputer/PycharmProjects/Testy/JakTestowac.py', line 10, in
assert 'Demobank – Bankowość Internetowa – Logowanie' == title
AssertionError

Widać, że chodzi o porównanie typu string z typem unicode.
Czyli, któraś z wartości jest innego typu jak to sprawdzić? Uprościłem kod aby było łatwiej.
W naszym przypadku wartość dla title jest zwracana jako unicode i dlatego wymusiłem taką wartość dodając u przed stringiem.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

title=u'Demobank – Bankowość Internetowa – Logowanie'
print(title)
print('Typ obiektu title: ' + type(title))

expected = 'Demobank – Bankowość Internetowa – Logowanie'
print('Typ obiektu expected', type(expected))

assert expected == title

No i mamy winnego – title jest innego typu niż to czego oczekujemy. No i mamy błąd bo Python nie chce porównać różnych obiektów 😀
Co zrobić? Trzeba je ujednolicić:
Albo zrobić z naszego title stringa tak:

title = title.encode('utf-8')
print('Typ obiektu title', type(title))
assert 'Demobank – Bankowość Internetowa – Logowanie' == title 

Albo naszą wartość oczekiwaną zrobić też typu unicode

expected = u'Demobank – Bankowość Internetowa – Logowanie'
print('Typ obiektu expected', type(expected))
assert expected == title

Czyli finalnie dla twojego kodu wystarczy tylko dodać u w tym miejscu:

assert u'Demobank – Bankowość Internetowa – Logowanie' == title

Na koniec gorąco zachęcam do przejścia na pythona3 to mega ułatwi Ci życie – no i wiesz nowsze w IT jest zawsze lepsze 😉 Jeśli masz Ubuntu w wersji 17.10 lub wyższej to masz go już zaistalowanego a jak nie masz to śmiało instaluj i ustaw w swoim IDE tę wersję.
Miłych eksperymentów i testowania!

AvatarKamil odpowiedział 5 lat temu

Dziękuję za wnikliwą analizę 🙂
Spróbowałem ze znakami “-” ale nie to było problemem (jednak bardzo cenna uwaga, dobrze wiedzieć że takie rzeczy mogą mieć wpływ na kod 🙂 )
Pomogło dodanie ”u” w assert 🙂
 
Pozdrawiam,

Krzysiek KijasKrzysiek Kijas Personel odpowiedział 5 lat temu

Ciesze się, że śmiga 😀 Oznaczam jako rozwiązane 😉
Pozdrawiam,