Вы правы в отношении проблемы. Selenium запускает тест до того, как Javascript заполняет ваше дерево DOM содержимым. Вы можете использовать Thread.sleep (), однако это замедлит ваши тесты и будет иногда давать сбой, если ваше приложение будет работать медленнее, чем вы ожидали. Лучше подождать элемента, пока не истечет время ожидания.
Все мои тесты расширяют этот класс, который, в свою очередь, расширяет SeleneseTestCase, и вместо вызова selenium.type () я вызываю type () в моих тестах:
public class WebTestCase extends SeleneseTestCase {
private final long DEFAULT_TIMEOUT = 30;
protected SeleniumServer server;
public WebTestCase() {
}
public WebTestCase(String name) {
super(name);
}
protected void startServer() throws Exception {
server = new SeleniumServer();
server.start();
}
protected void stopServer() {
server.stop();
}
public void waitForElement(final String waitingElement) {
waitForElement(waitingElement, DEFAULT_TIMEOUT);
}
public void waitForElement(final String waitingElement, long timeoutInSeconds) {
new Wait() {
@Override
public boolean until() {
return selenium.isElementPresent(waitingElement);
}
}.wait("Timeout while waiting for element " + waitingElement, timeoutInSeconds * 1000);
}
public void type(String element, String text) {
waitForElement(element);
selenium.type(element, text);
}
public void typeKeys(String element, String text) {
waitForElement(element);
selenium.typeKeys(element, text);
}
public void click(String element) {
waitForElement(element);
selenium.click(element);
}
public void select(String element, String value) {
waitForElement(element);
selenium.select(element, value);
}
public void check(String element) {
waitForElement(element);
selenium.check(element);
}
public void uncheck(String element) {
waitForElement(element);
selenium.uncheck(element);
}
public void focus(String element) {
waitForElement(element);
selenium.focus(element);
}
public void checkTextPresent(final String text) {
checkTextPresent(text, DEFAULT_TIMEOUT);
}
public void checkTextPresent(final String text, long timeoutInSeconds) {
new Wait() {
@Override
public boolean until() {
return selenium.isTextPresent(text);
}
}.wait("Timeout while waiting for text \"" + text + "\"", timeoutInSeconds * 1000);
}
public void checkTextNotPresent(final String text) {
checkTextPresent(text, DEFAULT_TIMEOUT);
}
public void checkTextNotPresent(final String text, long timeoutInSeconds) {
new Wait() {
@Override
public boolean until() {
return !selenium.isTextPresent(text);
}
}.wait("Timeout while waiting for text \"" + text + "\"", timeoutInSeconds * 1000);
}
}