2017-05-02 9 views
0

webdriverをセレンで無効にされるまで、私はpagination.Iを通じて各ページをナビゲートすることによって、テーブル内の行の要素を検証するには、各ページに移動し、要素を主張することができていますが、probelmです最後のページでは、次のリンクがグレー表示されていてもループは継続します。[次へ]をクリックしてリンクページネーション次のアクションが

次のリンクが無効になっている場合

<span> 
    <a class="next_btn inactive">NEXT ></a> 
    </span> 

次のリンクを有効にすると

<span> 
    <a class="next_btn" href="home.do?action=Next&start=10&end=20&sort=&   
    type=00&status=&fromDate=04/02/2017&toDate=05/02/2017&school=&  
    district=0009">NEXT ></a> 
    </span> 

実際のコード

public void submissionType() throws Exception { 
    driver.findElement(By.linkText("NEXT >")); 
    while(true) { 
     processPage(); 
     if (pagination.isDisplayed() && pagination.isEnabled()){ 
      pagination.click(); 
      Thread.sleep(100L); 
     } else 
      break; 

    } 
    } 

    private void processPage() { 
    String statusColumn="//td[@class='gridDetail'][2]"; 
    List<WebElement> list = table.findElements(By.xpath(statusColumn)); 
    for (WebElement checkbox : list) { 
     String columnName=checkbox.getText(); 
     Asserts.assertThat(columnName,"File"); 
    } 
    } 

答えて

0

By.linkText("NEXT >")で要素を識別する代わりに、By.cssSelector("a.next_btn")で識別してみてください。

この方法を使用すると、オブジェクトが無効になったときにそのクラス名が変更されるため、オブジェクトが識別されなくなり、ループが中断されます。

編集:例外を回避するためにtryブロックとCatch NoSuchElement例外を追加します。

+0

のようにそれらを書き、それゆえ、あなたのオブジェクトは、もはや希望でしょうあなたのループが壊れるでしょう。これは実際には真実ではありません...無効化されたボタンでさえ、CSSセレクタ 'a.next_btn'で検出されます。 – JeffC

+0

オブジェクトが無効になっている場合、CSSはa.next_btn.inactiveであってはいけませんか? a.next_btnを使用すると部分的なクラス名で識別されますか? –

+1

'a.next_btn.inactive'は、ボタンが無効になっていても' a.next_btn'でボタンが見つかるはずです。 'next_btn'と' inactive'は2つの異なるクラスです。 'a.inactive'は、ボタンが無効になっているときにボタンも見つけます。 – JeffC

0

あなたは既に回答を受け入れていますが、そのうちの1つが正しくないことは知っています。ロケータBy.cssSelector("a.next_btn")は、有効化ボタンと無効化ボタンの両方を見つけるので、ループが壊れることはありません。

コードを見ると、いくつかの提案/修正があります。

  1. .isEnabled()は本当に、本当にここには何も達成していないためにそのテストINPUTタグに取り組んでいます。

  2. Thread.sleep()を使用するのは良い方法ではありません。あなたはいくつかの説明をgoogleすることができますが、基本的に問題は柔軟性のない待機です。あなたが待っている要素が15ミリ秒で利用可能になった場合、あなたはまだ10秒間、またはあなたの睡眠が何に設定されているかを待つでしょう。明示的な待機(WebDriverWait)を使用することがベストプラクティスです。

私はあなたの機能をクリーンアップしないと、あなたは、このアプローチを使用すると、オブジェクトが無効になった場合、 `、そして、そのクラス名を変更します

public void submissionType() 
{ 
    WebDriverWait wait = new WebDriverWait(driver, 10); 
    By nextButtonLocator = By.cssSelector("a.next_btn:not(.inactive)"); 
    List<WebElement> nextButton = driver.findElements(nextButtonLocator); 
    while (!nextButton.isEmpty()) 
    { 
     processPage(); 
     nextButton.get(0).click(); 
     wait.until(ExpectedConditions.stalenessOf(nextButton.get(0))); // wait until the page transitions 
     nextButton = driver.findElements(nextButtonLocator); 
    } 
} 

private void processPage() 
{ 
    for (WebElement checkbox : table.findElements(By.xpath("//td[@class='gridDetail'][2]"))) 
    { 
     Asserts.assertThat(checkbox.getText(), "File"); 
    } 
} 
関連する問題