1つのテキストフィールドと2つの選択フィールドを持つページがあります。最初のドロップダウンで値を選択すると、ポストバックが発生し、2番目のドロップダウンに値が設定されます。セレンでドロップダウンリストを選択できません
これは1台のPCで動作しますが、テストサーバーでは動作しません。
テストサーバーでセレンメブテストを実行すると、常に「要素を見つけることができません」というメッセージが表示されます。私はタイマー、流暢、暗黙で明示的だが成功しなかった。
アイデア?
1つのテキストフィールドと2つの選択フィールドを持つページがあります。最初のドロップダウンで値を選択すると、ポストバックが発生し、2番目のドロップダウンに値が設定されます。セレンでドロップダウンリストを選択できません
これは1台のPCで動作しますが、テストサーバーでは動作しません。
テストサーバーでセレンメブテストを実行すると、常に「要素を見つけることができません」というメッセージが表示されます。私はタイマー、流暢、暗黙で明示的だが成功しなかった。
アイデア?
Thread.sleep()
を使用して最初のドロップダウン値を選択した後で遅延を追加できます。
'Thread.sleep()'は良い習慣ではありません。代わりに 'WebDriverWait'を使用して、最低所要時間だけ待つようにしてください。 – JeffC
異なるスレッドから別のページに移動するときや、ドロップダウンなどを選択しているときは、常に最低3秒間Thread.sleep()を使用してください。
'Thread.sleep()'は良い方法ではありません。代わりに 'WebDriverWait'を使用して、最低所要時間だけ待つようにしてください。 – JeffC
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(<Element Locator>));
ExpectedCondtionsには多くのオプションがあり、必要に応じて任意のものを選択します。ここで要素ロケータは2番目のドロップダウンロケータIDです。
@ user3436977、この状況ではFluentWaitを使用したいと思います。このような状況を処理する方法の完全な例がここにあります。私は、公開Webアプリケーションからの依存ドロップダウンを使用します。このロジックでは、オプションカウントが5以上になるまで "State"ドロップダウンを待っています(これは、動的要素がDOMにロードされていることを証明します)。
@Test(enabled=true)
public void dependentDropdown(){
WebDriver driver = new FirefoxDriver();
driver.get("http://phppot.com/demo/jquery-dependent-dropdown-list-countries-and-states/");
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(driver, 30);
Select country = new Select(wait.until(ExpectedConditions.presenceOfElementLocated(By.id("country-list"))));
country.selectByVisibleText("India");
FluentWait<WebElement> waitFor_state_list_population = new FluentWait<WebElement>(driver.findElement(By.id("state-list")));
wait.withTimeout(60, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.MILLISECONDS).ignoring(NoSuchElementException.class);
com.google.common.base.Function<WebElement, Boolean> elementLoaded = new com.google.common.base.Function<WebElement, Boolean>() {
@Override
public Boolean apply(WebElement ele) {
return ele.getTagName().equals("select")? new Select(ele).getOptions().size()>5? true: false: false;
}
};
if(waitFor_state_list_population.until(elementLoaded)){
Select state = new Select(driver.findElement(By.id("state-list")));
state.selectByVisibleText("Delhi");
}
driver.close();
driver.quit();
}
希望すると、これが役立ちます。
これまでに試したコードも共有できますか? –
...およびページまたは関連するHTMLへのリンク。 – JeffC