Всъщност отговорих на подобен въпрос тук
Не бих препоръчал делегиране на нищо на javascript по този начин.. Използвайте това, което ви дава Selenium.. това е много достатъчно.
Нещо, което поставям във всяка една рамка, която някога съм създавал, което е МНОГО ефективно.. Ето извадка от рамката, намерена тук.
Внедрявам нещо като метод от тип псевдо-изчакване, преди да извърша каквито и да е действия върху обекти. Опитайте сами. Много е ефективен.
Това са методи от AutomationTest клас
/**
* Checks if the element is present or not.<br>
* @param by
* @return <i>this method is not meant to be used fluently.</i><br><br.
* Returns <code>true</code> if the element is present. and <code>false</code> if it's not.
*/
public boolean isPresent(By by) {
if (driver.findElements(by).size() > 0) return true;
return false;
}
/**
* Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
*/
private WebElement waitForElement(By by) {
int attempts = 0;
int size = driver.findElements(by).size();
while (size == 0) {
size = driver.findElements(by).size();
if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
by.toString(),
MAX_ATTEMPTS));
attempts++;
try {
Thread.sleep(1000); // sleep for 1 second.
} catch (Exception x) {
fail("Failed due to an exception during Thread.sleep!");
x.printStackTrace();
}
}
if (size > 0) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");
return driver.findElement(by);
}
Това, което правя, е всеки път, когато изпълнявам нещо, като
getText(By.cssSelector("input#someId"))
ако не го намери от първия път, ще изчака 1 секунда. ако го намери тогава, продължава. прави това впоследствие 5 пъти, така че общо 5 секунди изчакване.. което е напълно добре, защото ако НЕ намерите елемента, от който се нуждаете, тогава вашият тест трябва ефективно да се провали в този момент.
Освен това от опит мога да ви кажа, че използването на driver.findElements()
е по-ефективно от тези WebDriverWait
.
Това не означава, че не ги използвам.. просто не за това. За съжаление, не бях добавил тази функционалност към началната работа със селеновата рамка, така че просто ще ви кажа кога използвах Webdriverwait's.
Така че моят тест ще изглежда така -
@Config(url="http://systemunder.test", browser=CHROME)
public class MyClass extends AutomationTest {
@Test
public void testSomething() {
setText(By.id("blah")) // if <* id="blah" /> doesn't exist, waits 1+ seconds for it to appear before interacting.
.click(By.id("Blah2")) // ^ same thing here.
.waitForPresent(By.cssSelector("ajaxy")); // this method right here would circumvent the hard waits, with webdriverwait's.
}
}
не помня точно защо не работеше за мен преди, но използването на webdriverwaits в нещо подобно е безупречно.
person
ddavison
schedule
10.10.2013