[英]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.