Selenium:无法在第二个循环中获取动态文本

时间:2017-04-24 12:44:00

标签: java selenium selenium-webdriver

我正在尝试获取动态文本并显示它,这会在while循环中执行。它成功显示文本,但在下一次迭代时不会一致显示。

在单击下拉元素后立即给出了隐式等待,以便在UI上更新数据。但我仍然没有得到理想的输出。还有什么我想念的,请告诉我。 此外,当我打印arraylist res_arr的索引时,它输出[]。 我的代码:

 while (i<list_size)
         {
            sl.getOptions().get(i).click();
            driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
            WebElement hcdata = driver.findElement(By.xpath("//form/div/div[3]/div[2]/div[1]/p"));
            System.out.println("HCdata: "+hcdata.getText());
            ar.add(hcdata.getText());

            WebElement freq = driver.findElement(By.xpath("//form/div/div[3]/div[3]/div[1]/p"));
            String freq_no = hcdata.getText().toString();
            System.out.println("Frequency: "+freq_no);
            ar.add(freq_no);


            WebElement DT = driver.findElement(By.xpath("//form/div/div[3]/div[4]/div[1]/p"));
            String DT_no = hcdata.getText();
            System.out.println("DT no: "+DT_no);
            ar.add(DT_no);

             i++;

            res_arr = indexOfAll(0,ar);
            System.out.println("Inside arraylist result");

                System.out.println(Arrays.toString(res_arr.toArray()));

         }

        }//end of try
        catch(Throwable e){
            System.out.println("Error found: "+e.getMessage());
        }

输出:

Size is 6 

HCdata: 12,865 

Frequency: 12,865

DT no: 12,865

Inside arraylist result

[]
HCdata:

Frequency: 

DT no: 0

Inside arraylist result

[]

HCdata: 

Frequency: 

DT no: 0

Inside arraylist result

[]

HCdata: 

Frequency: 

DT no: 16,479

Inside arraylist result

[]

HCdata: 
Frequency: 
DT no: 275
Inside IndexofAll method
Inside arraylist result
[]
HCdata: 
Frequency: 
DT no: 
Inside IndexofAll method
Inside arraylist result
[]

1 个答案:

答案 0 :(得分:0)

首先,您要对所有三个hcdata操作使用getText()

尝试以下更改:

String freq_no = hcdata.getText().toString();

为:

String freq_no = freq.getText().toString();

String DT_no = hcdata.getText();

为:

String DT_no = DT.getText();

第二个问题是隐式等待只等待元素出现,如果它们已经在页面上但没有值,则会立即返回。

您想要的是明确等待。类似的东西:

sl.getOptions().get(i).click();

By hcdataBy = By.xpath("//form/div/div[3]/div[2]/div[1]/p");
//this would wait up to 10 seconds for the wait condition. Change the 2nd parameter if longer or shorter would be better.
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(new ExpectedCondition<Boolean>(){
    public Boolean apply(WebDriver d) {
        return d.findElement(hcdataBy).getText().length() > 0;
    }
});

这是一个自定义预期条件,如果可以的话,最好使用现有的ExpectedConditions

将此更改为使用现有ExpectedConditions的一种可能方法是:

wait.until(ExpectedConditions.not(ExpectedConditions.textToBePresentInElementLocated(hcdata, "")));

取决于数据加载时getText()的实际值。

隐式等待要考虑的另一件事是,一旦设置它,您的测试将使用它直到您更改它。因此,如果您在循环的开头设置它,它将在每次测试从那时开始找到元素时使用该隐式等待。这可能会导致一些令人困惑的行为,因为在代码中设置隐式等待时很难跟踪。出于这个原因,以及其他一些时间问题和错误,我建议只使用显式等待