bugfix> java > 投稿

異なる数の要素で動作するようにこのメソッドを変更するにはどうすればよいですか? たとえば、3つの要素と5つの要素がある場合があります。 私は、このループがそれを見つけることができる限り要素を探して、そうでなければ壊れることを望んでいます。 現在、要素が3つしかない場合、「要素を特定できません」というエラーが発生し、テストは失敗します。

public void checkProductsInOrder() {
    for (int i = 1; i <= 5; i++) {
        WebElement element = driver.findElement(By.xpath("(//td[@data-id=\"product_name\"])[" + i + "]"));
        wait.until(ExpectedConditions.visibilityOf(element));
        productsInOrder.add(element.getText());
    }

回答 2 件
  • findElements を使用できます  一致したすべての要素を見つけて、一致した要素のみのループを繰り返すメソッド。 findElements  methodは、ロケーターに基づいてすべての一致した要素を検索します。

    変更されたコードを確認してください

    //It will match all the product name based on the xpath (index alone needs to be removed from your index)
          List<WebElement> element = driver.findElements(By.xpath("(//td[@data-id='product_name'])"));
            int size=element.size();
            for(int i=0;i<size;i++){
                productsInOrder.add(element.get(i).getText()); 
            }
    
    

  • これはSelenium固有のものではありません(この場合、より良い解決策があるようです)が、APIが複数のオプションを提供しない場合があるため、知っておく価値があります。

    Javaでファイルから行を読み取るときの一般的なパターンです。 whileループの前に変数を宣言し、条件内で変数を割り当てて比較します。 findElement もリファクタリングします  読みやすさを向上させる独自の方法に。

    private WebElement findElement(final int num)
    {
        return driver.findElement(
            By.xpath("(//td[@data-id=\"product_name\"])[" + num + "]")
        );
    }
    
    

    メソッドは次のようになります。

    WebElement element;
    int count = 0;
    while ((element = findElement(count++)) != null)
    {
        wait.until(ExpectedConditions.visibilityOf(element));
        productsInOrder.add(element.getText());
    }
    
    

あなたの答え