有没有办法测试元素是否存在?任何findElement方法都会以异常结束,但这不是我想要的,因为它可能是一个元素不存在而且没关系,这不是测试的失败,因此异常不能成为解决方案。
我发现了这篇文章:Selenium c# Webdriver: Wait Until Element is Present 但这是针对C#而我并不是很擅长。任何人都可以将代码翻译成Java吗?我很抱歉,我在Eclipse中尝试过但是我没有把它直接用到Java代码中。
这是代码:
public static class WebDriverExtensions{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){
if (timeoutInSeconds > 0){
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
答案 0 :(得分:246)
使用findElements
代替findElement
。
findElements
将返回一个空列表。
要检查元素是否存在,您可以试试这个
Boolean isPresent = driver.findElements(By.yourLocator).size() > 0
如果找到至少一个元素,则返回true,如果不存在则返回false。
答案 1 :(得分:51)
如何只查找元素并确定它是否存在的私有方法如下:
private boolean existsElement(String id) {
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
return false;
}
return true;
}
这很容易,也可以胜任。
编辑:你甚至可以更进一步,以By elementLocator
作为参数,如果你想通过id以外的其他东西找到元素,就可以解决问题。
答案 2 :(得分:14)
我发现这适用于Java:
WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);
答案 3 :(得分:7)
public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
return driver.findElement(by);
}
答案 4 :(得分:5)
我有同样的问题。对我来说,根据用户的权限级别,页面上不会显示某些链接,按钮和其他元素。我的套件的一部分是测试缺少应该丢失的元素。我花了好几个小时试图解决这个问题。我终于找到了完美的解决方案。
这样做,告诉浏览器查找指定的任何和所有元素。如果它导致0
,则表示没有找到基于规范的元素。然后我让代码执行一个if语句让我知道它没有找到。
这是C#
,因此需要对Java
进行翻译。但不应该太难。
public void verifyPermission(string link)
{
IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
if (adminPermissions.Count == 0)
{
Console.WriteLine("User's permission properly hidden");
}
}
根据您的测试需要,您还可以选择其他路径。
以下代码段正在检查页面上是否存在非常具体的元素。根据元素的存在,我有测试执行if else。
如果元素存在并显示在页面上,我console.write
让我知道并继续前进。如果有问题的元素存在,我就无法执行我需要的测试,这是需要设置它的主要原因。
如果元素不存在,并且未显示在页面上。我在if else中执行了测试。
IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
//if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
//script to execute if element is found
} else {
//Test script goes here.
}
我知道我对OP的回应有点迟了。希望这有助于某人!
答案 5 :(得分:5)
试试这个: 调用此方法并传递3个参数:
示例:waitForElementPresent(driver,By.id(“id”),10);
public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {
WebElement element;
try{
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait()
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
element = wait.until(ExpectedConditions.presenceOfElementLocated(by));
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait
return element; //return the element
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
答案 6 :(得分:3)
使用Java编写以下函数/方法:
protected boolean isElementPresent(By by){
try{
driver.findElement(by);
return true;
}
catch(NoSuchElementException e){
return false;
}
}
在断言期间使用适当的参数调用方法。
答案 7 :(得分:3)
通过在try catch语句之前缩短selenium超时,可以使代码运行得更快。
我使用以下代码检查元素是否存在。
protected boolean isElementPresent(By selector) {
selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
logger.debug("Is element present"+selector);
boolean returnVal = true;
try{
selenium.findElement(selector);
} catch (NoSuchElementException e){
returnVal = false;
} finally {
selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
}
return returnVal;
}
答案 8 :(得分:2)
如果你在ruby中使用rspec-Webdriver,你可以使用这个脚本,假设一个元素真的不存在而且它是一个通过的测试。
首先,首先从类RB文件中编写此方法
class Test
def element_present?
begin
browser.find_element(:name, "this_element_id".displayed?
rescue Selenium::WebDriver::Error::NoSuchElementError
puts "this element should not be present"
end
end
然后,在您的spec文件中,调用该方法。
before(:all) do
@Test= Test.new(@browser)
end
@Test.element_present?.should == nil
如果您的元素不存在,您的规范将会通过,但如果该元素存在,则会抛出错误,测试失败。
答案 9 :(得分:2)
这对我有用:
if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
//THEN CLICK ON THE SUBMIT BUTTON
}else{
//DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}
答案 10 :(得分:0)
您可以尝试隐式等待:
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));
`
或者您可以尝试显式等待:`
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("someDynamicElement"));
});
`
显式将在某个操作之前检查元素是否存在。可以在代码中的每个位置调用隐式等待。例如,在一些AJAX操作之后。
您可以在SeleniumHQ page
找到更多内容答案 11 :(得分:0)
我会使用类似的东西(使用Scala [旧代码中的代码&#34;良好&#34; Java 8可能与此类似]):
object SeleniumFacade {
def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = {
val elements = maybeParent match {
case Some(parent) => parent.findElements(bySelector).asScala
case None => driver.findElements(bySelector).asScala
}
if (elements.nonEmpty) {
Try { Some(elements(withIndex)) } getOrElse None
} else None
}
...
}
那么,
val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement))
答案 12 :(得分:0)
提供我的代码片段。因此,以下方法检查随机网络元素&#39; 创建新应用程序&#39;按钮是否存在于页面上。请注意,我将等待时间用作 0 秒。
public boolean isCreateNewApplicationButtonVisible(){
WebDriverWait zeroWait = new WebDriverWait(driver, 0);
ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']"));
try {
zeroWait.until(c);
logger.debug("Create New Application button is visible");
return true;
} catch (TimeoutException e) {
logger.debug("Create New Application button is not visible");
return false;
}
}
答案 13 :(得分:0)
这应该这样做:
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
//do what you need here if you were expecting
//the element wouldn't exist
}
答案 14 :(得分:0)
要查找特定元素是否存在,我们必须使用findElements()方法而不是findElement()..
int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");
这对我有用.. 建议我,如果我错了..
答案 15 :(得分:0)
我在Java中找到的最简单的方法是:
List<WebElement> linkSearch= driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){ //do something you want}
答案 16 :(得分:-1)
public boolean isElementDisplayed() {
return !driver.findElements(By.xpath("...")).isEmpty();
}
答案 17 :(得分:-2)
就个人而言,我总是寻求上述答案的混合,并创建一个可重复使用的静态效用方法,该方法使用size()&lt; 0建议:
public Class Utility {
...
public static boolean isElementExist(WebDriver driver, By by) {
return driver.findElements(by).size() < 0;
...
}
这是整洁,可重复使用,可维护......所有好东西; - )