我有一个精选城市下拉列表,大约有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();
}
}
有没有办法克服并快速进行测试?
答案 0 :(得分:2)
问题可能是getFirstSelectedOption
引起的,因为该方法会为每个选项发送isSelected
命令:
所以而不是:
s.getFirstSelectedOption().getText()
,我会使用选择器来获取第一个选择的选项:
preferredCity.findElement(By.cssSelector("option[selected]")).getText()
<强>更新强>
当选择更改时,DOM中的selected
属性不会更新。
因此,另一种方法是阅读selectedIndex
上的<select>
属性:
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();
答案 1 :(得分:1)
虽然单个下拉列表中的8000个城市是一个值得怀疑的设计,但它可能不是整个问题。我创建了一个包含100,000个选项的简单HTML文件,并从该列表中选择了一个值,它在12秒内完成,包括加载整个页面。当然,它没有在网络上托管。您的互联网连接和/或网站的速度可能是因素。
我会看一些事情:
您似乎在WebDriverWait
中使用Comman.wait
(常见拼写错误,顺便说一下)。你还在使用隐含的等待吗?如果是这样,the docs声明不要混合使用。
警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。
如果是,请删除隐式等待,看看是否有帮助。
接下来我会尝试一些时间。在每个步骤之间添加一个时间点,以查看长时间等待的位置。有了这些信息,您就可以更好地了解延迟的来源以及如何解决这些问题。
您正在等待装载程序隐藏得比我认为必要的更多。这应该没关系,但删除其中一些可能会有所帮助,特别是如果您使用隐式等待(请参阅#1)。你抓住SELECT后等待它,这是不需要的。你在else
的第一行再次等待它,但你没有做任何应该触发加载器的事情。从下拉列表中选择项目后,唯一合理的地方是第3个实例。
您是否尝试按值而非可见文字进行选择?这可能没关系,但我不确定它是如何找到可见文本的。
另一种选择是完全避免使用Select
类。虽然正常使用它是一个很好的做法,因为它使得处理SELECT变得更加容易,在这种情况下,它可能会导致性能问题。
绕过它的一种方法可能是直接使用CSS选择器,例如, #ddlPrefferedSourceCity > option[value='" + preferredCityName + "']
。我在我的本地机器上尝试了这个并且它稍微快了......但它相差1.2秒vs .6s。
答案 2 :(得分:0)
我真的不知道为什么花时间使用getFirstSelectedOption
我已经尝试了JavascriptExecutor
,其中我使用jQuery命令
public String getDropdownValue()
{
JavascriptExecutor e = (JavascriptExecutor) driver;
return (String) e.executeScript("return $('#ddlPrefferedSourceCity').val();");
}
现在我可以获取值甚至更改下拉值并再次找到所选值。现在时间是5-8 second
。