簡體   English   中英

有沒有辦法減少Selenium WebDriver中的元素定位時間?

[英]Is there any way to reduce element locating time in Selenium WebDriver?

我有一個精選的城市下拉菜單,大約有8000個城市禮物。 我的用例是:

  1. 獲取所選城市名稱
  2. 如果城市名稱不符合預期,則選擇所需的城市
  3. 現在再次獲取城市名稱以驗證是否已選擇所需的城市

我的代碼工作正常,但問題是完成這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命令:

https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/ui/Select.java#L93

所以代替:

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秒內完成,包括加載整個頁面。 當然,它沒有在網絡上托管。 您的互聯網連接和/或網站的速度可能是因素。

我會看幾件事:

  1. 你似乎在Comman.wait使用WebDriverWait (Common拼寫錯誤,順便說一句)。 你還在使用隱含的等待嗎? 如果是這樣, 文檔聲明不要混合兩者。

    警告:不要混合隱式和顯式等待。 這樣做會導致不可預測的等待時間。

    如果是,請刪除隱式等待,看看是否有幫助。

  2. 接下來我會嘗試一些時間。 在每個步驟之間添加一個時間點,以查看長時間等待的位置。 有了這些信息,您就可以更好地了解延遲的來源以及如何解決這些問題。

  3. 你正在等待加載器比我認為必要的更多看不見。 這應該沒關系,但刪除其中一些可能會有所幫助,特別是如果您使用隱式等待(請參閱#1)。 你抓住SELECT后等待它,這是不需要的。 你在else的第一行再次等待它,但你沒有做任何應該觸發加載器的事情。 從下拉列表中選擇項目后,唯一合理的地方是第3個實例。

  4. 您是否嘗試過按值而不是通過可見文本進行選擇? 這可能沒關系,但我不確定它是如何找到可見文本的。

  5. 另一個選擇是完全避免使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM