我有一个场景可以从叠加层中单击“X”图标。当我使用selenium.isElementPresent("//img[@src='close.jpg']")检查元素时;它返回真实。但是当我执行selenium.click("//img[contains(@src,'close.jpg')]") ; 操作它会引发异常“元素当前不可见,因此可能无法与之交互”。
尝试了所有类型的 xpath,但无法解决问题。
首先尝试使用几种方法:
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
public boolean isElementVisible(By selector){
return driver.findElement(selector).isDisplayed();
}
那么如果您的页面没有被强制呈现,请尝试使用一些等待机制:
Thread.sleep(1000);
driver.manage().timeouts().implicitlyWait(2,TimeUnit.SECONDS);
和fluentWait机制:。
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(org.openqa.selenium.NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo; } ;
fluentWait(By.xpath(..blablabla...)).click();
您还可以进行 jsCode 注入:1)如果支持 jQuery
String cssSelector="blablabla";
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("var x = $(\'"+cssSelector+"\');");
stringBuilder.append("x.click();");
js.executeScript(stringBuilder.toString());
2)通过DOM模型定位需要的元素:例如
String js="document.getElementsByTagName('div')[34].click();"
jsCodeExecution(js);
public void jsCodeExecution(String jsCode){
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(jsCode);
js.executeScript(stringBuilder.toString());
}
也尝试一步一步调试,看看问题出在哪里。希望它可以帮助你。
此外,我建议您在 firepath 中验证您找到的 css 选择器和 xpath 验证(firefox 中的 firebug 插件):