2012-11-27 17 views
6

Po raz pierwszy testuję Selenium. Na stronie głównej wywołuję niektóre AJAX i chcę, aby Selenium oczekiwało na załadowanie elementu. Nie jestem pewien, czy to działa, ale po prostu wpisuję selen, a waitForCondition jest w stanie wybrać.Selenium waitForCondition

Nieważne, co wybiorę, zawsze zwraca "fałsz". Nie teraz, jeśli waitForCondition zadziała?

Jak mogę sprawdzić, czy to działa? Co ja robię źle w tych kodach?

selenium.waitForCondition("//input[@name='Report'", "3000"); 
selenium.waitForCondition("//*[@id='MyTable']", "3000"); 
selenium.waitForCondition("css=.someClass2", "3000"); 

Jeśli przez wprowadzenie własnej klasy - powrót "prawda"

private boolean isElementPresent(By by) { 
    try { 
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } 
} 

isElementPresent (By.xpath ("// * [@ id = 'MojaTabela']")) - zwrot " true "

Odpowiedz

3

waitForCondition służy tylko do wywoływania kodu JavaScript, a nie do oczekiwania na załadowanie elementów.

Co masz w isElementPresent jest w porządku. Chciałbym połączyć je z wyraźnymi czeka się być nieco bardziej dokładne informacje, gdy element jest faktycznie załadowane i obecny na ekranie:

http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

porządku, tę pracę. Czy masz przykład tego, czego używasz w JAVA. Myślę, że jest to dużo kodu, który muszę napisać za każdym razem, kiedy go używam. WebElement myDynamicElement = (nowa WebDriverWait (kierowca, 10)). (Aż nowy ExpectedCondition () { \t \t \t \t @Override \t \t \t \t WebElement publicznych zastosowanie (WebDriver d) { \t \t \t \t \t return d.findElement (By.id ("MyTable")); \t \t \t \t}}); ' – boje

+0

@Arankuj to rozwiązanie Prace. Aktualizuję to. Dzięki za rozwiązanie. – RNS

0

Aaran skierował Cię do właściwej dokumentacji Selenium WebDriver waits.

Widać, że piszą także o klasie ExpectedConditions. Zawiera kilka pomocnych implementacji klas ExpectedCondition, takich jak "is element present one", czyli ExpectedConditions.presenceOfElementLocated.

Oto przykład użycia go:

WebDriver driver = new ChromeDriver(); 
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php"); 

driver.findElement(By.name("word")).sendKeys("bird is the word");; 
driver.findElement(By.cssSelector("input[type='button']")).click(); 
WebDriverWait driverWait = new WebDriverWait(driver, 10); 
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p"))); 
System.out.println(dynamicElement.getText()); 

Jeśli okaże się to zbyt rozwlekły, dlaczego po prostu nie byłaby to i wyodrębnić funkcję, która będzie akceptować lokalizatora elementem a webdriver i zwraca jesteś żywiołem?

DriverWait.until() przyjmowanie instancji ExpectedCondition jest jak przekazanie funkcji predykatu, po prostu wykonanie jej przez klasę lub w przykładowej dokumentacji anonimową klasę zagnieżdżoną, ponieważ w Javie nie można wysłać funkcji .

"Funkcja" ExpectedCondition również zwraca wartość, która może być przydatna w przypadku, gdy czekasz na warunek dla jakiegoś elementu (lub jakiejś innej wartości z WebDrivera), więc zwrócenie go pozwoli ci zaoszczędzić połączenie.

+0

Z jakiegoś powodu funkcja _ExpectedConditions_ nie jest znana. Tekst: ExpectedConditions nie może zostać rozwiązany – boje

+0

Z jakiegoś powodu nie mam _org.openqa.selenium.support.ui.ExpectedConditions_ Skąd mogę pobrać ten prawidłowy plik JAR? Mam org.openqa.selenium.support.ui.ExpectedCondition (bez "S" na) – boje

+0

Jakiej wersji selenu używasz? Testowałem kod w wersji 2.25.0 za pośrednictwem programu maven, ale można go pobrać pod adresem http://seleniumhq.org/download/ –

1

Można to zrobić tak:

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000"); 

To będzie czekać na elemencie być załadowane do 30 sekund.

+0

To nie działa. Według @Arran, _waitForCondition_ jest tylko dla wywołań JavaScript. Odbywa się to za pośrednictwem JAVA i IE8 – boje

+0

Powinien działać. Do testowania aplikacji ajaxowej zawsze wolę tę metodę .. Odniesienie do tego linku http://www.seleniumwiki.com/selenium-rc/using-selenium-waitforcondition/ –

1

Nadzieja to działa dla Ciebie

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() { 
public Boolean apply(WebDriver driver) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    return (Boolean) js.executeScript("return jQuery.active == 0"); 
} 

});

Spowoduje to sprawdzenie, czy biblioteka jQuery ma aktywne żądania AJAX przez 30 sekund.

2

C#

Można to zrobić tak:

Przede wszystkim można ustawić wartość limitu czasu dla tego stanu.

Następnie można użyć warunku.

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1)); 
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath")))); 

LUB

Wait.Until(driver => driver.FindElement(By.XPath("xPath"))); 

To wszystko.

0

Spróbuj raz:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);