C# で同じコードを記述する方法は?
List<WebElement> displayedOptions = driver.FindElements(By.TagName("select"));
for (WebElement option : displayedOptions)
{
if (option.displayed)
{
displayedOptions.Add(option);
}
}
C# で同じコードを記述する方法は?
List<WebElement> displayedOptions = driver.FindElements(By.TagName("select"));
for (WebElement option : displayedOptions)
{
if (option.displayed)
{
displayedOptions.Add(option);
}
}
select
HTML 要素 (つまり、ドロップダウン)用に特別に作成されたクラスがあります。
OpenQA.Selenium.Support.UI名前空間内のSelectElementクラスです。
これは要素のラッパーであり、select
要素内で人々が使用/操作する一般的なものに簡単にアクセスできますselect
。
あなたの例は次のように変換されます(LINQを使用しているため、C#3以上を使用):
IList<IWebElement> selectElements = driver.FindElements(By.TagName("select"));
var displayedSelectElements = selectElements.Where(se => se.Displayed);
このコードが何をするかを知ることは重要です。最初にすべての 要素を見つけselect
て、それらを新しいリストに入れます。
select
次に、表示されている要素、つまり.Displayed
プロパティがtrueである要素のみにフィルターをかけます。これはサンプル コードの直訳です。
ただし、何をしようとしているのかを実際に指定していないため、次の例の方が適していると思います。
var selectElement = new SelectElement(driver.FindElement(By.Id("something")));
var displayedOptions = selectElement.Options.Where(o => o.Displayed);
上記は特定 select
の要素を見つけ、その中のオプションを表示されているものだけにフィルタリングしますselect
。繰り返しますが、つまり、.Displayed
プロパティをtrueにします。
編集
上記のコードは必要なものですが、ループの形式が必要なためfor
、同様のものは次のようになります。
var selectElement = new SelectElement(driver.FindElement(By.Id("something")));
var allOptions = selectElement.Options;
for (int i = 0; i < allOptions.Length; i++)
{
if (allOptions[i].Displayed)
{
// do something
// like add to a new list?
}
}
FindElements は ReadOnlyCollection を返します。だから定義したほうがいい
ReadOnlyCollection<IWebElement> displayedOptions = driver.FindElements(By.TagName("select"));
for (WebElement option : displayedOptions)
{
if (option.displayed)
{
//displayedOptions.Add(option); //You can't do that
// do something else
}
}