[英]Is there any way to reduce element locating time in Selenium WebDriver?
我有一个精选的城市下拉菜单,大约有8000个城市礼物。 我的用例是:
我的代码工作正常,但问题是完成这3个步骤需要大约5-8分钟。 我知道它是由于下拉列表中有大量的城市名称
这是下拉HTML结构:
<div class="col-md-12">
<label class="mmk-filter-control">Preferred Source City : </label>
<div class="pull-right refe-link">
<div class="mmk-filter-control mmk-select-filter pull-right mr5">
<select id="ddlPrefferedSourceCity" class="form-control" name="ddlPrefferedSourceCity">
<option value="-1">- Select -</option>
<option value="A.S.Peta Bypass">A.S.Peta Bypass</option>
<option value="aadsar">aadsar</option>
<option value="aagariya">aagariya</option>
<option value="aahur">aahur</option>
<option value="aakadiya">aakadiya</option>
<option value="Aala">Aala</option>
<option value="Aanjangaon">Aanjangaon</option>
.
.
around 8000 options
代码是:
if(usersname.size()>0)
{
Select s = new Select(preferredCity);
Comman.wait.until(ExpectedConditions.invisibilityOf(loader));
String cityName = s.getFirstSelectedOption().getText();
if(cityName.equals(preferredCityName))
{
LogWriter.logger.info("Preferred City is already Selected");
TakeScreenshot.passedScreenShot();
}
else
{
Comman.wait.until(ExpectedConditions.invisibilityOf(loader));
LogWriter.logger.info("Last Selected Preferred City is : " + s.getFirstSelectedOption().getText());
TakeScreenshot.passedScreenShot();
s.selectByVisibleText(preferredCityName);
setPreferenceButton.click();
Comman.wait.until(ExpectedConditions.invisibilityOf(loader));
LogWriter.logger.info("New Selected Preferred City is : " + s.getFirstSelectedOption().getText());
TakeScreenshot.passedScreenShot();
}
}
有没有办法克服并快速进行测试?
问题可能是由于getFirstSelectedOption
因为该方法为每个选项发送了isSelected
命令:
所以代替:
s.getFirstSelectedOption().getText()
,我会使用选择器来获取第一个选择的选项:
preferredCity.findElement(By.cssSelector("option[selected]")).getText()
更新
选择更改时,DOM中不会更新selected
属性。 所以另一种方法是读取<select>
上的selectedIndex
属性:
int selectedIndex = Integer.parseInt(preferredCity.getAttribute("selectedIndex"));
WebElement selectedOption = preferredCity.findElement(By.cssSelector(
String.format("option:nth-child(%s)", selectedIndex + 1)));
String text = selectedOption.getText();
或者使用executeScript
:
String JS_GET_FIRST_SELECTED_OPTION =
"var e=arguments[0], i=e.selectedIndex; return i < 0 ? null : e.options[i];";
JavascriptExecutor jse = (JavascriptExecutor)driver;
WebElement selectedOption = (WebElement)jse.executeScript(JS_GET_FIRST_SELECTED_OPTION, preferredCity);
if (selectedOption == null)
throw new NoSuchElementException("No options are selected");)
String text = selectedOption.getText();
虽然单个下拉列表中的8000个城市是一个值得怀疑的设计,但它可能不是整个问题。 我创建了一个包含100,000个选项的简单HTML文件,并从该列表中选择了一个值,它在12秒内完成,包括加载整个页面。 当然,它没有在网络上托管。 您的互联网连接和/或网站的速度可能是因素。
我会看几件事:
你似乎在Comman.wait
使用WebDriverWait
(Common拼写错误,顺便说一句)。 你还在使用隐含的等待吗? 如果是这样, 文档声明不要混合两者。
警告:不要混合隐式和显式等待。 这样做会导致不可预测的等待时间。
如果是,请删除隐式等待,看看是否有帮助。
接下来我会尝试一些时间。 在每个步骤之间添加一个时间点,以查看长时间等待的位置。 有了这些信息,您就可以更好地了解延迟的来源以及如何解决这些问题。
你正在等待加载器比我认为必要的更多看不见。 这应该没关系,但删除其中一些可能会有所帮助,特别是如果您使用隐式等待(请参阅#1)。 你抓住SELECT后等待它,这是不需要的。 你在else
的第一行再次等待它,但你没有做任何应该触发加载器的事情。 从下拉列表中选择项目后,唯一合理的地方是第3个实例。
您是否尝试过按值而不是通过可见文本进行选择? 这可能没关系,但我不确定它是如何找到可见文本的。
另一个选择是完全避免使用Select
类。 虽然正常使用它是一种很好的做法,因为它使得处理SELECT变得更加容易,在这种情况下,它可能会导致性能问题。
绕过它的一种方法可能是直接使用CSS选择器来选择,例如#ddlPrefferedSourceCity > option[value='" + preferredCityName + "']
。 我在我的本地机器上尝试了这个并且它稍微快了......但它相差1.2秒vs .6s。
我真的不知道为什么花时间使用getFirstSelectedOption
获取下拉值
我已经尝试过JavascriptExecutor
,其中我使用jQuery命令填充了下拉列表的值
public String getDropdownValue()
{
JavascriptExecutor e = (JavascriptExecutor) driver;
return (String) e.executeScript("return $('#ddlPrefferedSourceCity').val();");
}
现在我能够获得值甚至更改下拉值并再次找到所选值。 现在时间是5-8 second
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.