私は初めてSeleniumを使用していますが、オプションに圧倒されています。 FirefoxでIDE)を使用しています。
私のページが読み込まれると、その後、JSONPリクエストを介して値がフェッチされ、selectにオプションが入力されます。
続行する前に、選択の特定のオプションが表示されるのをSeleniumに待機させるにはどうすればよいですか?
私はあなたが使うべきだと思います
waitForElementPresent
コマンド。可能であれば、Selenium IDEコードを見てみましょう。
waitForElementPresent
with css targetを使用しました。
例:待つ
<select id="myselect"></select>
を入力する
<option value="123">One-two-three</option>
使用する
waitForElementPresent
css=#myselect option[value=123]
私は次のような便利なものを見つけました:
wait.until(
ExpectedConditions
.presenceOfNestedElementsLocatedBy(By.id(<selectioNId>), By.tagName("option"))
)
ドロップダウン内のオプションがサードパーティのサービスからフェッチされるという同様の問題がありましたが、これは操作が遅い場合がありました。
Select select = new Select(driver.findElement(cssSelector("cssSelectorOfSelectBox")));
waitUnitlSelectOptionsPopulated(select)
これがwaitUnitlSelectOptionsPopulatedの定義です
private void waitUntilSelectOptionsPopulated(final Select select) {
new FluentWait<WebDriver>(driver)
.withTimeout(60, TimeUnit.SECONDS)
.pollingEvery(10, TimeUnit.MILLISECONDS)
.until(new Predicate<WebDriver>() {
public boolean apply(WebDriver d) {
return (select.getOptions().size() > 1);
}
});
}
注:この場合、静的オプションが常に1つ表示されていたため、select.getOptions()。size()> 1のチェックが必要でした。
「WaitForSelectOption」コマンドを使用して、値をlabel = 1のような直接ラベルにすることができます-普通預金口座のターゲットにはオブジェクトIDがあります
が入力されたときにselectを返すC#で次の関数を作成しました。
要素を見つけるにはByを渡す必要があり、要素がいっぱいになるのを待つ特定の時間は次のとおりです。
public static SelectElement FindSelectElementWhenPopulated(this IWebDriver driver, By by, int delayInSeconds)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(delayInSeconds));
return wait.Until<SelectElement>(drv =>
{
SelectElement element = new SelectElement(drv.FindElement(by));
if (element.Options.Count >= 2)
{
return element;
}
return null;
}
);
}
私の場合、選択に3つ以上のオプションがあることを検証します。コードを変更して、ニーズに合った数量を検証できます。
Java 8Awaitility
を使用する
Awaitility.await()
.atMost(5, TimeUnit.SECONDS)
.until(() -> select.getOptions().size() > 0);
私のためのその仕事:
WebElement element = driver.findElement(By.xpath("//select[@name='NamE']/option[1]"));
return element.getAttribute("text");