要素が存在するかどうかをテストする方法はありますか? findElementメソッドは例外で終了しますが、要素が存在しないことが問題にならない場合もありますし、テストに失敗することもないため、例外が解決策になることはありません。
私はこの記事を見つけました: Selenium c#Webdriver:要素が現れるまで待つ しかしこれは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);
}
}
findElements
の代わりにfindElement
を使用してください。
例外の代わりに一致する要素が見つからない場合、findElements
は空のリストを返します。
要素が存在することを確認するには、これを試すことができます
Boolean isPresent = driver.findElements(By.yourLocator).size() > 0
少なくとも1つの要素が見つかった場合はtrueを返し、存在しない場合はfalseを返します。
単純に要素を探し、それが次のように存在するかどうかを判断するプライベートメソッドについてはどうでしょうか。
private boolean existsElement(String id) {
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
return false;
}
return true;
}
これは非常に簡単で、仕事をします。
編集:あなたはさらに進むと、パラメータとしてBy elementLocator
を取ることができます、あなたがid以外の何かによって要素を見つけたいなら問題を排除します。
私はこれがJavaのために働くことがわかりました:
WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);
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);
}
私は同じ問題を抱えていました。私にとっては、ユーザーの許可レベルによっては、リンク、ボタン、その他の要素がページに表示されません。私のスイートの一部は、欠けているべき要素が欠けていることをテストしていました。私はこれを理解するために何時間も費やしました。私はついに完璧な解決策を見つけました。
これがすることは、指定されたベースに基づいてありとあらゆる要素を探すようブラウザに指示することです。結果が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 ifを実行させます。
要素が存在し、ページに表示されている場合は、console.write
を教えてもらって先に進みます。問題の要素が存在する場合は、必要なテストを実行できません。これが、これを設定する必要がある主な理由です。
要素が存在せず、ページに表示されない場合私は他にテストを実行する場合があります。
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への返答に少し遅れているのを知っています。うまくいけば、これは誰かに役立ちます!
試してみてください。このメソッドを呼び出して、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;
}
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;
}
Javaを使用して以下の関数/メソッドを書きます。
protected boolean isElementPresent(By by){
try{
driver.findElement(by);
return true;
}
catch(NoSuchElementException e){
return false;
}
}
アサーション中に適切なパラメータでメソッドを呼び出します。
もしあなたが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
あなたの要素が存在しない場合、あなたの仕様は合格しますが、その要素が存在する場合、それはエラーをスローします、テストは失敗しました。
これは私のために働く:
if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
//THEN CLICK ON THE SUBMIT BUTTON
}else{
//DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}
public boolean isElementDisplayed() {
return !driver.findElements(By.xpath("...")).isEmpty();
}
暗黙の待ちを試すことができます。
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"));
});
`
Explicitは何らかのアクションの前にelementが存在するかどうかをチェックします。暗黙の待機は、コード内のあらゆる場所で呼び出すことができます。例えばAJAXアクションの後などです。
もっとあなたが見つけることができます SeleniumHQページ
特定の要素が存在するかどうかを調べるには、findElement()の代わりにfindElements()メソッドを使用する必要があります。
int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");
これは私のために働いています。私が間違っているなら私に示唆してください。
これはそれをするはずです:
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
//do what you need here if you were expecting
//the element wouldn't exist
}
コードの断片を渡します。そのため、以下のメソッドは、ランダムなWeb要素「Create New Application」ボタンがページに存在するかどうかを確認します。待機期間は秒として使用しています。
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;
}
}
私は(Scalaでは[古い "良い" 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))
私がJavaで見つけた最も簡単な方法は次のとおりです。
List<WebElement> linkSearch= driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){ //do something you want}