下面是我的selenium测试用例的代码片段,其中我使用select方法从下拉列表中选择一个值。下一步是点击提交。但是当我尝试点击提交按钮时,页面没有刷新(这将刷新同一页面),抛出
元素不可点击,StaleElementReference异常
。对我有用的唯一解决方案是thread.sleep()
。
我尝试了以下所有选项,但没有运气:(
explicit wait()
,wait.until(Exceptedcontions.visibility)
,element to be clickable()
等尝试了网络上的所有解决方案。
我必须在测试用例中使用thread.sleep()
3-4次,并且我有大约100个测试用例,这会耗费大量时间。
在点击提交按钮之前,Web驱动程序等待页面完全刷新并完全加载DOM的任何工作解决方案。
@Test
@Timeout(group = Group.SLOW)
public void testProvider() throws InterruptedException {
proceedToProvider();
new Select(driver.findElement(By.id("searchId"))).selectByVisibleText("Search");
Thread.sleep(2000);
driver.findElement(By.id("btnSubmit")).click();
timeSplit("Search submitted");
以下是我使用其他解决方案时看到的错误。
org.openqa.selenium.WebDriverException:未知错误:元素不是 可点击(1289,141)。其他元素将收到点击: (会议信息:chrome = 53.0.2785.116)(驱动信息: chromedriver = 2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform = Windows NT 6.1 SP1 x86_64)(警告:服务器未提供任何堆栈跟踪 信息)命令持续时间或超时:168毫秒构建信息: 版本:'2.49.1',修订版: '808c23b0963853d375cbe54b90bbd052e2528a54',时间:'2016-01-21 09:37:52'系统信息:主持人:'ALAKASIMA01-W7L',ip:'10 .145.45.233', os.name:'Windows 7',os.arch:'amd64',os.version:'6.1', java.version:'1.8.0_73'驱动程序信息: org.openqa.selenium.remote.RemoteWebDriver功能 [{applicationCacheEnabled = false,rotate = false, mobileEmulationEnabled = false,chrome = {chromedriverVersion = 2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir = C:\用户\ kasima01 \应用程序数据\本地\ TEMP \ scoped_dir6628_12218}, takesHeapSnapshot = true,databaseEnabled = false,handlesAlerts = true, hasTouchScreen = false,版本= 53.0.2785.116,platform = XP, browserConnectionEnabled = false,nativeEvents = true, acceptSslCerts = true,locationContextEnabled = true, webStorageEnabled = true,browserName = chrome,takesScreenshot = true, javascriptEnabled = true,cssSelectorsEnabled = true}]会话ID: 8bf0b4cc7efc715015509f4be345d14d
答案 0 :(得分:0)
public void WaitForElementToLoad(String selector, String key, String seconds)
throws ValidationException {
Integer time = Integer.valueOf(seconds);
WebElement element = null;
while (time > 0) {
try {
element = getSpecificWebElement(selector, key);
break;
} catch (ValidationException e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
time--;
}
}
if (element == null && time <= 0) {
// throw your own exception
}
}
上述方法显示了执行此操作的基本方法之一。 getSpecificWebElement
是一个可以自己定义的方法,使用findElementByXX并抛出自己的异常进行捕获。通过上限,您将等待特定元素。
还有另一种解决方案 - 使用driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
指定驱动程序在搜索元素时应等待的时间(如果元素不立即存在)。
<强>更新强>
我想我最好发布getSpecificWebElement
private WebElement getSpecificWebElement(String selector, String key)
throws ValidationException {
WebElement element = null;
String expression = "";
By by = composeSelector(selector, key);
try {
element = FindElementBy(by);
} catch (TimeoutException e) {
throw new ValidationException("not found " + expression);
} catch (Exception e) {
throw new ValidationException(
Exceptions.getShortStackTraceAsString(e));
}
return element;
}
private WebElement FindElementBy(By by) {
final By selector = by;
ExpectedCondition<WebElement> ec = new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(selector);
}
};
WebDriverWait wait = new WebDriverWait(driver, 10);
return wait.until(ec);
}
在这种情况下,等待时间足够,将是X(传递的秒值)* 10.
答案 1 :(得分:0)
试试这会检查整个页面是否已加载?
static void waitForPageLoad(WebDriver wdriver) {
WebDriverWait wait = new WebDriverWait(wdriver, 60);
Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
}
};
wait.until(pageLoaded);
}
希望这对你有用。