更快地替代SelectedOption以在下拉菜单中检索所选项目?

时间:2017-03-03 13:49:26

标签: c# selenium selenium-webdriver

我需要能够从下拉菜单中检索所选选项。我目前使用以下代码(Selenium和C#):

var selectName = new SelectElement(driver.FindElement(By.Id("Name"));
string name= selectName.SelectedOption.Text;

这样可行,但在包含大量项目(1000+)的下拉菜单上非常慢(10秒以上)。有没有其他方法可以更快地提供结果?

1 个答案:

答案 0 :(得分:1)

SelectedOption属性的implementation遍历所有选项,并返回所选选项。在这种情况下,大多数工作都是由客户端绑定完成的。

您可以尝试通过CSS直接检索当前选定的<option>,这可能会更快。

例如:

driver.Navigate().GoToUrl("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select");
driver.SwitchTo().Frame(driver.FindElement(By.Id("iframeResult")));

Console.WriteLine(driver.FindElement(By.CssSelector("select option:checked")).Text);

new SelectElement(driver.FindElementByTagName("select")).SelectByText("Saab");

Console.WriteLine(driver.FindElement(By.CssSelector("select option:checked")).Text);

分别会产生VolvoSaab

修改:我很快就尝试了一个<select>标签,其中有10000个选项,其中选择了第400个选项:

var sw = new Stopwatch();
sw.Start();
Console.WriteLine(driver.FindElement(By.CssSelector("select option:checked")).Text);
sw.Stop();
Console.WriteLine("CSS: {0}", sw.Elapsed);

sw = new Stopwatch();
sw.Start();
Console.WriteLine(new SelectElement(driver.FindElement(By.TagName("select"))).SelectedOption.Text);
sw.Stop();
Console.WriteLine("SelectElement: {0}", sw.Elapsed);

在Chrome中运行比较,运行时差异很大:

CSS:           00:00:00.0383144
SelectElement: 00:00:14.6210520