2016-07-25 4 views
1

私のコードでは、「Please wait ...」が必要です。上のパネルのUIが最初に消えてブロックされているので、その特定のブロックを明示的に待ちますスパン。しかし、上記のパネルがブロックされていても、その機能はまだ保存されていますが、パネルのクリック機能は連続して開始されます。明示的な待機がSelenium Webdriverで機能しない

driver.findElement(By.id("saveHouseholdMember")).click(); 
WebDriverWait uiBlock = new WebDriverWait(driver, 30); 
uiBlock.until(ExpectedConditions.invisibilityOfElementWithText(By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span"), "Please wait...")); 
driver.findElement(By.id("disabilityFlagRadio")).click(); 

ここでは、保存ボタンをクリックすると、そのパネルが[Please wait ...]メッセージでブロックされます。ドライバは、「Please wait ...」というメッセージが消えるまで待つ必要があります。その場合は、以下のように記述されたクリック機能を実行する必要があります。上記パネルの保存には通常15秒かかります。

以下のリンクも参照していますが、有用な情報はありませんでした。 Wait is not working in selenium webdriver

+1

「しばらくお待ちください...」というメッセージが表示される前にセレンが待っている可能性はありますか? – Woodham

+0

+1、最初にパネルが表示されるのを待って、パネルが見えるようになってからパネルが消えるのを待っていることを確認してください。 – Kudin

+1

あなたはそのパネルが表示されていることを確認している場合は、表示される次の要素を待つことができ 'WebElement要素= wait.until( ExpectedConditions.visibilityOfElementLocated(By.id( "disabilityFlagRadio")));' – Harish

答えて

2

は、だから私の推測では、あなたのテストを見つけ、パネルが表示されます前の要素の不可視性チェックを通過して移動していることです。これは、最初に起こる競合状態、セレンテストのチェック、またはパネルを見えるウェブサイトがあるためです。最初にパネルが表示されていることを確認し、消滅したことを確認するだけで、これを修正することができます。これは、これの競合状態の側面の一部を制限します。ただしではなくですが、競合状態の問題を修正してください。次の例では、パネルが表示されてから消滅すると、の前にが表示され、パネルが表示され、パネルが表示されて実行されると、パネルは表示されません。最善の方法は、パネルのコードが消えて、完了したときにセットされるコードが、ページのコードやロジックを知らない状態を探すことです。 1つの例は、Web開発者が保存アクション(完了時に)を持っていて、CSSクラスをいくつかの要素に追加した場合です。そして、あなたのテストはそのクラスを取得する要素を待つことができます。 (レース条件付き)ナイーブ例:

// Do stuff to get to the page needed for the test 
driver.findElement(By.id("saveHouseholdMember")) 
     .click(); 
// Make sure the panel first appears and then disappears 
By panelBy = By.xpath("/html/body/div[2]/form[1]/div/table/tbody/tr/td/span"); 
new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(panelBy)); 
new WebDriverWait(driver, 30).until(ExpectedConditions.invisibilityOfElementLocated(panelBy)); 
// Panel is gone, click the next button 
driver.findElement(By.id("disabilityFlagRadio")) 
     .click(); 

注ウェブドライバ待ちの作成で30はそれが最大30秒間、希望の可視性の状態で一致する要素をチェックし続けることを意味していること。その時点で正しい可視性状態の一致する要素が見つからない場合は、TimeoutExceptionがスローされます。また、あなたが提供したXPathによってパネルが配置されていることに注意してください。ただし、XPath式は絶対的なものであるため、推奨しません。可能であれば、セレンのロケータとしてXPathから離れているのは、テストのメンテナンスのために読むのが壊れて迷惑になる可能性があるからです。通常は、多くのクリーナーを読み取る方法で、他のロケーター戦略(CSSセレクター、名前、IDなど)を使用して同じ要素を(より簡単に)取得できます。 の場合は絶対にXPathが必要です(たとえば、ページ上の特定のテキストを検索する必要がある場合など)。相対XPathを使用します。以下の(単純な)例:

<html> 
    <body> 
     <div> 
      <span> 
       <input name="foo"></input> 
      </span> 
     </div> 
    </body> 
</html> 

あなたがその入力を見つけるために、絶対XPathを使用している場合、それは次のようになります。

By.xpath("/html/body/div/span/input") 

しかし、チェーン全体のどの部分場合にセレクタが壊れます変更(例えば、動作を変更しないdivを追加するとテストが中断されます)。代わりに、相対XPathを使用できます。

By.xpath("//input[@name='foo']") 

この例でも欠陥があり、相対XPathの例に過ぎないことに注意してください。

By.name("foo") 
+0

あなたWebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By))は、次の要素を待つことで簡単に達成できる場合、スパンの可視性と非可視性のソリューションを提供する理由は何ですか? .id( "disabilityFlagRadio"))); '代わりに?? –

+0

ページには2つのセクションがあり、最初の部分が上部に影響を及ぼし、idが 'disabilityFlagRadio'のセクションが下部にあることがわかります。上のセクションがセーブしている間に、そのidで見つかった要素が画面に表示されている場合、それが見えるのを待つだけで、競合状態が同じになります(例えば、セービングが表示される前にセレンが要素を見つけ、 、これは可視です ")。しかし、それが間違っていて、保存が完了した後に要素*のみ*が現れるならば、それはもっと簡単で良いでしょう。 –

関連する問題