Wpis z mikrobloga

Mirko, mam pytaniePiszę test automatyzujący aplikację korzystając z Selenium i Pythona.

Jak liczę jakieś elementy o określonej klasie to korzystam z takiego rozwiązania:

http://pastebin.com/CzMXATXi

Jak nie znajdzie określonego obiektu to wyrzuca błąd, jest break i zwraca licznik.

Teraz chciałem na podobnej zasadzie zrobić coś w tym stylu:

http://pastebin.com/FS7gx23g

Chodzi o to, że kreator ma trzy kroki i chciałem zrobić jedną funkcję klikającą 'Dalej'. Jeśli nie znajdzie odnośnika kończacego się na step1 to przechodzi do wyjątku i próbuje kliknąć na step2. Jeśli i jego nie znajdzie to w drugiej klauzuli except ma kliknąć na step3. I nie działa. Dla 'step1' poprawnie klika 'Dalej', ale gdy jest w oknie, gdzie jest link 'step2' nie zgłasza błędu, ale czeka na ten odnośnik.

Skracając pytanie. Dlaczego:

set.append(driver.findelementsbyid('przykladoweID')[i])

zwraca błąd gdy chcę dodać trzeci element o tym ID, na stronie są dwa, natomiast nie wraca błędu gdy chcę dodać pierwszy element, a na stronie nie ma żadnego (tylko czeka aż się taki pojawi)?

Ja już sobie tę kwestię rozwiązałem na około, ale mógłby ktoś wyjaśnić dlaczego Selenium/Python zachowują się inaczej w pozornie identycznych sytuacjach?

#python #selenium
  • 5
dorzuć implicitly_wait


@Skarfejs: Jak już pisałem - ja sobie to rozwiązanie napisałem inaczej i uzależniłem link od obecności innego obiektu na stronie. Bardziej mnie zaciekawiła ta kwestia niz szukanie alternatywnego rozwiązania, a z implicitly wait nie lubię się bawić szczególnie.

być może Ci się race condition


@Skarfejs: To w moim przypadku jest niemożliwe, prosty test na aplikacji do której tylko ja mam dostęp.

W sumie to chcę wykorzystać test żeby
@venomik: Oba twoje kody są straszne. Łapanie wszystkich wyjątków, to tragiczna praktyka.

set
to jest już funkcja w pythonie, także nazywanie tak zmiennej ją przysłania. Jesteś pewien, że chcesz robić fora do 1000, a nie po prostu przeiterować po wszystkich znalezionych elementach z określoną klasą css?

Tym bardziej że ten pierwszy kod robi mniej więcej coś takiego:

elements = driver.find_elements_by_class_name(


'ClassName'


)


return
```**```
 
```**```
len
```**```
(elements)
@aseeon: Spokojnie. Set wstawiłem tylko na potrzeby prezentacji kodu, a takiego rozwiązania jak na początku już nie stosuję, ono miało służyć jako czytelny przykład jak się zachowuje Selenium w takich okolicznościach.

Btw: przecież ten for i tak by sie nie wykonywał tysiąc razy ale do pierwszego błędu ;-)