2016-05-19 11 views
0

機能:私たちは、国、州、市三つのフィールドを持っている -下の画像でEmpty cityドロップダウンを見つける方法は?

enter image description here

をした後、それは国のリストを明らかにした後、それは都市のリストを明らかに状態を選択国を選択します。

質問:この州では都市がないので、どのように国、州がセレンを使って都市リストを持たない人をリストしているのでしょうか?

私はこのような以下のコードを試みたが、ループは国、州、市のため&

@Test 
public void findstate() throws InterruptedException { 
    WebDriver driver = new FirefoxDriver(); 
    driver.get("URL"); 
    Select country = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCountryId']"))); 
    List<WebElement> countrylist = country.getOptions(); 
    System.out.println(countrylist.size()); 
    for (int i = 1; i <= countrylist.size(); i++) { 
     countrylist.get(i).click(); 
     Select state = new Select(driver.findElement(By.xpath("//*[@id='UserProfileStateId']"))); 
     List<WebElement> statelist = state.getOptions(); 
     for (int j = 1; j <= statelist.size(); j++) { 
      statelist.get(j).click(); 
      Select city = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCityId']"))); 
      List<WebElement> citylist = city.getOptions(); 
      System.out.println("Country, state list of Empty Cities"); 
      if (citylist.size() > 1) { 
       System.out.println(countrylist.get(i).getText() + "-----" + statelist.get(j).getText() + "-----"); 
      } 

     } 

    } 

} 

空のリストを示していないソースコード機能していません。

<span class="select-wrapper"><select name="data[UserProfile][country_id]" class="custom-select valid" id="UserProfileCountryId" aria-invalid="false" aria-required="true"> 
 
<option value="">Country</option> 
 
<option value="1">Afghanistan</option> 
 
<option value="2">Albania</option> 
 
</select><span class="holder">Afghanistan</span></span> 
 
<select name="data[UserProfile][state_id]" class="custom-select valid" id="UserProfileStateId" aria-invalid="false" aria-required="true"> 
 
<option value="">State</option> 
 
<option value="42">Badakhshan</option> 
 
<option value="43">Badgis</option> 
 
<option value="44">Baglan</option> 
 
</select> 
 
<select name="data[UserProfile][city_id]" class="custom-select valid" id="UserProfileCityId" aria-invalid="false" aria-required="true"> 
 
<option value="">City</option> 
 
<option value="5916">Andarab</option> 
 
<option value="5917">Baghlan</option> 
 
</select>

+0

ための31ミリ秒

おかげで私はあなたのHTMLソースコード – sri

+0

もソースコードを追加した私は、コードを入力するには、細かいですが、しかし、持っていますあなたが言ったように待機コマンドをロードする時間を使用するが、私はこのコードのこの待機コマンドを使用する方法を取得していないですか? 私は待機コマンドを試みたが、別のエラーが発生しました –

答えて

0

コピーのためにいくつかのタイプミスがあります&ペーストと思います。

ループ内に正しいSelect変数を使用する必要がありますが、常にcountryを使用します。このようなforeach文を使用する方がよいかもしれません。このエラーを回避するには

@Test 
public void findstate() throws InterruptedException { 
    WebDriver driver = new FirefoxDriver(); 
    driver.get("URL"); 
    Select country = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCountryId']"))); 
    List<WebElement> countrylist = country.getOptions(); 
    System.out.println(countrylist.size()); 
    for (int i = 1; i <= countrylist.size(); i++) { 
     countrylist.get(i).click(); 
     Select state = new Select(driver.findElement(By.xpath("//*[@id='UserProfileStateId']"))); 
     List<WebElement> statelist = state.getOptions(); 
     for (int j = 1; j <= statelist.size(); j++) { 
      statelist.get(j).click(); 
      Select city = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCityId']"))); 
      List<WebElement> citylist = city.getOptions(); 
      System.out.println("Country, state list of Empty Cities"); 
      if (citylist.size() > 1) { 
       System.out.println(countrylist.get(i).getText() + "-----" + statelist.get(j).getText() + "-----"); 
      } 

     } 

    } 

} 

ことは、これを試してみてください

for (WebElement element : country.getOptions()) { } 

私はあなたのHTMLコードを知らないが、それはまたあるかもしれません他のドロップダウンがでいっぱいになるのを待ってから、getOptions()と尋ねるのには、が必要です。セレンは非常に速く、サイトによってロードされる前にドロップダウンのオプションを尋ねるかもしれません。この場合、更新されたコードを使用しても結果は得られません。

はこのようにすべての時間を埋めるためにドロップダウンを待つようにしてください:

Select country = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCountryId']"))); 
    List<WebElement> countrylist = country.getOptions(); 
    System.out.println(countrylist.size()); 
    for (WebElement element : countrylist) { 
     element.click(); 
     Select state = new Select(driver.findElement(By.xpath("//*[@id='UserProfileStateId']"))); 

     WebDriverWait wait = new WebDriverWait(driver, 30); 
     wait.until(new Function<WebDriver, WebElement>() { 
     public WebElement apply(WebDriver webdriver) { 
      return state.getOptions() > 1; 
      } 
     }); 

     List<WebElement> statelist = state.getOptions(); 
     .... 

あなたは都市のオプションに同じことを行う - >あなたは何の都市を持っていない状態を発見したタイムアウトに実行する場合.. 。

+0

をしたい – sri

+0

特定の条件を待つ方法を示すために私の答えを更新しました - この場合、ドロップダウンに複数の要素が設定されるまで – drkthng

0

こんにちは、最も外側のループ国を選択して

@Test 
public void findstate() throws InterruptedException { 
    WebDriver driver = new FirefoxDriver(); 
    driver.get("URL"); 
    WebDriverWait wait = new WebDriverWait(driver,20); 
    Select country = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCountryId']"))); 
    List<WebElement> countrylist = country.getOptions(); 
    System.out.println(countrylist.size()); 
    for (int i = 0; i <= countrylist.size(); i++) { 
     countrylist.get(i).click(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='UserProfileStateId']"))); 
     Select state = new Select(driver.findElement(By.xpath("//*[@id='UserProfileStateId']"))); 
     // here use state not country 
     List<WebElement> statelist = state.getOptions(); 
     for (int j = 0; j <= statelist.size(); j++) { 
      statelist.get(j).click(); 
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='UserProfileCityId']"))); 
      Select city = new Select(driver.findElement(By.xpath("//*[@id='UserProfileCityId']"))); 
     // here use city not country 
      List<WebElement> citylist = city.getOptions(); 
      for (int k = 0; k <= citylist.size(); k++) { 
       citylist.get(k).click(); 
       System.out.println("Country, state list of Empty Cities"); 
       if (citylist.get(k).getText() == null) { 
        System.out.println(countrylist.get(i).getText() + "-----" + statelist.get(j).getText() + "-----"+ citylist.get(k).getText()); 
       } 
      } 
     } 
    } 
} 
+0

返信rajのThnaks、 これを実行するとエラーが発生しました。 "org.openqa.selenium.TimeoutException:By.xpathにある要素の可視性を20秒待ってからタイムアウトしました:// * [@ id = 'UserProfileStateId']" – sri

0

以下のようにしてみてください、その後、内側のループでその国のために、それぞれの状態を選択し、市が発見されたかどうかを確認してください。そうでなければ都市&国&をこのようにしなさい。

私はそう思います。

0

その「タブ」キーを追加した後、国に

driver.findElement(By.xpath("//*@id='UserProfileCountryId']")).sendKeys(Keys.TAB); 

を選択しかし、実行しながら、私は別の問題を抱えて、うまく働いた、いくつかの時間後、私はエラー org.openqa.seleniumを得たスクリプトを実行します。StaleElementReferenceException:ElementはもはやDOM コマンド期間またはタイムアウトに添付されています答え

関連する問題