我在Selenium WebDriver中使用Java编写了一些测试用例,并在网格(集线器和多个节点)上执行它们。我注意到由于NoSuchElementException
导致一些测试用例失败。什么是避免NoSuchElementException
并确保始终找到元素的最佳和最有效的方法?
答案 0 :(得分:26)
您永远无法确定是否会找到该元素,实际上这是功能测试的目的 - 告诉您页面上是否有任何更改。但有一点肯定有帮助的是添加等待通常导致NoSuchElementException
的元素的等待
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
答案 1 :(得分:5)
我完全同意上面的Petr Mensik。你永远不能说元素是否存在的问题。 你应该清楚地了解它何时发生。根据我的经验,我应该说它是由于以下原因而发生的:
NoSuchElementException
因此,使用一个函数调用来处理所有这三个条件的最强大的IMHO方法是使用fluentWait
作为Amith003建议。
所以代码如下:
让ur元素具有定位器:
String elLocXpath= "..blablabla";
WebElement myButton= fluentWait(By.xpath(elLocXpath));
myButton.click();
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()
块强大的代码换行try{} catch{}
。
也不要忘记
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
这也很有用。
因此,如果您想避免NoElement
异常,只需正确处理它就可以得出结论,因为没有人能够确保页面中的元素存在。
希望你现在更清楚了。此致
答案 2 :(得分:4)
您也可以使用FluentWait
,
每个FluentWait
实例定义等待条件的最长时间,以及检查条件的频率。
此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在搜索页面上的元素时NoSuchElementExceptions
。
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
答案 3 :(得分:1)
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
elementToBeClickable 等待元素的启用和可见
答案 4 :(得分:1)
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {
FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
.pollingEvery(pollingSec, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class, TimeoutException.class);
for (int i = 0; i < 2; i++) {
try {
//fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
fWait.until(ExpectedConditions.visibilityOf(element));
fWait.until(ExpectedConditions.elementToBeClickable(element));
}
catch (Exception e) {
System.out.println("Element Not found trying again - " + element.toString().substring(70));
e.printStackTrace();
}
}
return element;
}
答案 5 :(得分:1)
当定位器(即id / xpath / css选择器)无法在网页上找到网络元素时,发生NoSuchElementException。
原因可能是:
定位器不正确
Web元素在网页上不可用
为了避免此异常,我们可以使用Fluent Wait。这种等待使我们可以定义最大超时,轮询频率并定义要忽略的异常。
请在下面找到Fluent wait的示例用法:
.withTimeout(50, TimeUnit.SECONDS)
.pollingevery(3, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
答案 6 :(得分:0)
我通常在主函数
中使用这一行public static void main(String[] args) throws ParseException {
driver= new ChromeDriver();
driver.manage().window().maximize();
**driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);**
希望这有帮助。
答案 7 :(得分:0)
我们可以应用以下代码来删除此异常情况
通过应用WebDriverWait,webdriver对象等待元素的特定时间(以秒为单位)以便其可见性。
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOf(link));
我们可以通过Generic方法
中的try-catch块处理NoSuchElementException public boolean isElementPresent(By by) {
boolean isPresent = true;
try {
driver.findElement(by);
} catch (NoSuchElementException e) {
isPresent = false;
}
return isPresent
}
http://selenium-code.blogspot.in/2017/08/selenium-exception-nosuchelementexcepti.html
答案 8 :(得分:0)
有时可以等待所需项目的下载。
driver.get("https://zzzzzzzzz.market/items/mirage_prime_set")
WebDriverWait(driver, 20)
.until(
EC.visibility_of_element_located(
(By.XPATH, ('//div[@class="orders-row__element order__price sell_color"]')
)))
有时您需要做一些事情,以便UI框架加载数据。例如滚动页面
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
然后获取必要的数据
responsetext=driver.page_source
from lxml import html
parsed_body = html.fromstring(responsetext)
obj1 = parsed_body.xpath('.//div[@class="orders-row__element order__price sell_color"]/span[1]')
print(len(obj1))