2012-12-03 32 views
7

Czy mimo to można sprawdzić, czy element jest obecny w sterowniku sieci Selenium? Próbuję użyć tego kodu:Sprawdź, czy element jest obecny.

if @driver.find_element(:link, "Save").displayed? == true 

, ale spowoduje to złamanie wyjątku, co nie jest tym, czego oczekiwałem, ponieważ nadal chcę, aby skrypt nadal działał.

Odpowiedz

6

@driver.find_element zgłasza wyjątek o nazwie NoSuchElementException.

Możesz więc napisać własną metodę, która używa funkcji catch catch i zwraca wartość true, gdy nie ma wyjątku, a false, gdy występuje wyjątek.

+1

Dzięki, używam "ratunku" i rozwiązałem ten problem – Thanh

+0

Gr8, aby go usłyszeć ... Jeśli to pomogło, powinieneś zaakceptować odpowiedź. –

+0

Nie mam wystarczającej reputacji (minimum 15), aby zaakceptować twoją odpowiedź teraz, ale pozwól mi, że tym razem będę Ci winien, Przyjmuję twoją odpowiedź później :) – Thanh

7

Nie jestem ekspertem i Ruby można poczynić pewne błędy składniowe, ale można uzyskać ogólne pojęcie:

if @driver.find_elements(:link, "Save").size() > 0 

Ten kod nie rzucać NoSuchElementException

Ale ta metoda "zawiesić się" na chwilę, jeśli masz ponad zero i nie ma żadnych elementów na stronie. Drugi problem - jeśli element istnieje na stronie, ale nie jest wyświetlany, dostaniesz true.

Aby obejść próby utworzenia metoda:

def is_element_present(how, what) 
    @driver.manage.timeouts.implicit_wait = 0 
    result = @driver.find_elements(how, what).size() > 0 
    if result 
     result = @driver.find_element(how, what).displayed? 
    end 
    @driver.manage.timeouts.implicit_wait = 30 
    return result 
end 
+0

Dzięki za sugestię, nie muszę już czekać na "zawieszenie się" metody. – Thanh

+0

Dlaczego wymagana jest opcja implicit_wait? Czy nie lepiej nie mieć go, ponieważ upewni się, że element jest obecny po załadowaniu całej strony? Czy źle rozumiem to? Pomóż mi! –

1

Jeśli to oczekuje się, że element powinien być na stronie bez względu na to, co uważam, że warto użyć selenium wait object z element.displayed?, zamiast begin/rescue:

wait = Selenium::WebDriver::Wait.new(:timeout => 15) 
element = $driver.find_element(id: 'foo') 
wait.until { element.displayed? } ## Or `.enabled?` etc. 

Jest to przydatne w przypadkach, gdy części strony wymagają dłuższego renderowania, niż inne.

Powiązane problemy