2017-04-24 54 views
0

我正在嘗試獲取動態文本並顯示它,它將在while循環中執行。它會成功顯示文本,但不會在下一次迭代中一致顯示。Selenium:無法在第二個循環中獲取動態文本

已經在下拉元素單擊後給出了隱式等待權限,以便數據在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 
[] 
+0

而不是使用隱含等待,我建議你用流利的等待等到文本不爲空,並給予超時。或者你可以創建幫助方法,當結果仍爲空時重試 類似 'while(!HCdata ||超時未達到){ 把你在這裏找到元素的代碼 }' 變化隱含的等待和findElement組合,並使用WebdriverWait 'WebDriverWait等待=新WebDriverWait(webdriver的,timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(yourxpath)));' –

回答

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; 
    } 
}); 

這是一個自定義ExpectedCondition,當你可以把它最好的辦法是利用現有ExpectedConditions

一種可能的方式來將其更改爲使用現有ExpectedConditions會是這樣的:

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

取決於數據加載時getText()的實際值。

隱含等待需要考慮的另一件事是,一旦你設置了它,你的測試將使用它,直到你改變它。所以如果你在循環的開始處設置它,那麼每次你的測試找到一個元素時,它都會使用這個隱含的等待。這可能會導致一些令人困惑的行爲,因爲在代碼中設置隱式等待時可能很難跟蹤。出於這個原因,以及其他一些時間問題和錯誤,我建議只使用顯式等待

+0

Hi.It的作品。添加明確的等待,與應用方法爲我工作,謝謝:) – codefemme

相關問題