2017-02-27 9 views
0

私は、ユーザーの入力を処理するために、フレームワーク内に明示的待機メソッドを作成しようとしています。このメソッドは、すべてのタイプの検索(id、xpath、およびcss)を処理​​することになっています。私は見当もつかない明示的待機戻り異常なfindElement値

org.openqa.selenium.NoSuchElementException: Unable to locate element: #\/\/div\[\@id\=\'slideOut\-nav\'\]\/ul\/li\[2\]\/a 

:私は、このメソッドをテストしようとしたとき しかし、エラーが

方法の明示的な待ち時間の奇妙なエラーに私が受けてる

public static void isDisplaying(String variable){ 
    wait = new WebDriverWait(driver,3); 
    System.out.println("Looking for: " + variable); 

    if (driver.findElement(By.id(variable)).isDisplayed()){ 
     System.out.println("Found variable via id"); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(variable))); 
    } else if (driver.findElement(By.xpath(variable)).isDisplayed()) { 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(variable))); 
     System.out.println("Found variable via xpath"); 
    } else if (driver.findElement(By.cssSelector(variable)).isDisplayed()){ 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(variable))); 
     System.out.println("Found variable via css"); 
    } else { 
     System.out.println(variable +" is not displayed."); 
    } 
} 

エラーを返していますなぜそれがすべての前後のスラッシュで値を返すのか。私の推測では、IDを使用してxpath文字列を検索しようとするとすぐにアプリケーションが失敗したということです。しかし、次のelse if文に移動してはいけませんか?これが本当に問題なのであれば、私はそのような問題をどのように処理すべきですか?

私は単に要素とクリックを見つけた場合、それは正常に動作し、正しいパスを返します。

//div[@id='slideOut-nav']/ul/li[2]/a 

私は任意の助けをいただければ幸いですのでloooooong時間のために、この問題に引っかかってきましたの!

答えて

1

要素が見つからない場合、driver.findElement(By.id(variable))の呼び出しは例外をスローするようにバインドされています。

driver.findElement()への呼び出しをdriver.findElements()に置き換えてください。この呼び出しは例外をスローしませんが、呼び出しが失敗した場合は空のWeb要素のリストを返すためです。

あなたは本当に一般的な方法の構築を探しているなら、あなたは最初にそれがxPathまたはcssを表しどうかを確認するためにvariable内容を解析する必要があり、最終的にバックid (or) nameを使用してにフォール。

参照のためにthis implementationをご覧ください。

+0

こんにちはクリシュナンのようにそれを呼ぶだろう、ご回答ありがとうございました。ちょうど新しいことを学びました!要素が見つからない場合、findElementはただちに例外をスローすることは決して知りませんでした。私は、ロケータを識別するために変数の最初の文字をチェックすることによってif文で自分のコードを修正しました。 – MikeyC

+0

@MikeyC - 私の答えが助けられたら、私の答えを受け入れることができますか? –

+0

私はすべての変数を "Variablename"に再割り当てして問題を修正しました。助けてくれてありがとう! – MikeyC

0

あなたの機能が何を意図しているかわかりません。要素が表示されているかどうかを確認していて、それが表示されるのを待っているかどうかを確認しています。要素が表示されている場合は、既に表示されています。

Stringを渡す代わりに、ロケータByを渡します。ロケータを渡すことで、異なるロケータタイプをすべて確認する必要がなくなります。

booleanの戻り値の型を関数に追加しました。再利用できるようになりました。要素が表示されるまで最大3秒間待機します。タイムアウトしない場合、要素は表示され、trueを返します。タイムアウトした場合、要素は表示されず、falseを返します。コードを以下に減らすことができます。

public static boolean isDisplaying(By locator) 
{ 
    try 
    { 
     new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(locator)); 
     return true; 
    } 
    catch (TimeoutException e) 
    { 
     return false; 
    } 
} 

あなたは

System.out.println(isDisplaying(By.xpath("//div[@id='slideOut-nav']/ul/li[2]/a"))); 

または

System.out.println(isDisplaying(By.id("someId"))); 
+0

こんにちはジェフ、あなたのお返事ありがとうございます。私は、ユーザーが何を入力するのか知りません。したがって、if文です。私が提供しているのは、3(id、xpath、css)のうちの1つを含むかもしれないハードコードされた変数です。ユーザーはそれを気にするべきではありません。 – MikeyC

+0

おそらく、元の質問にこれを追加してください。あなたが "the user"と言及したとき、私はあなたがこの機能を消費しようとしているオートメーターを意味していると仮定しました。ユーザーがこれらのロケータの1つを手作りしようとしている場合、どの種類のクラフトを行っているのかがわかります。 id、cssセレクター、xpathなどで選択できるユーザー入力の一部としてドロップダウンなどを追加する必要があります。そうすれば、それらを解析することなく2つを正しくまとめることができます。あなたはまだIDといくつかのCSSセレクタを区別するのに苦労するでしょう。 – JeffC

0
public void waitUntilElementclickable(WebElement element){ 
    //Waits Until Element is Clickable on screen 
    WebDriverWait wait = new WebDriverWait(driver, 10); 
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
} 
+1

このコードスニペットは歓迎されていますが、いくつかの助けを与えるかもしれませんが、* how *と* Why *がこれを解決する(説明があれば大きく改善されます)(// meta.stackexchange.com/q/114762)問題。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

関連する問題