有没有办法减少Selenium WebDriver中的元素定位时间?

时间:2017-07-06 13:44:11

标签: java selenium selenium-webdriver

我有一个精选城市下拉列表,大约有8000个城市礼物。我的用例是:

  1. 获取所选城市名称
  2. 如果城市名称不符合预期,请选择所需的城市
  3. 现在再次获取城市名称以验证是否已选择所需城市
  4. 我的代码工作正常,但问题是完成这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();
         }
    }
    

    有没有办法克服并快速进行测试?

3 个答案:

答案 0 :(得分:2)

问题可能是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属性不会更新。 因此,另一种方法是阅读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秒内完成,包括加载整个页面。当然,它没有在网络上托管。您的互联网连接和/或网站的速度可能是因素。

我会看一些事情:

  1. 您似乎在WebDriverWait中使用Comman.wait(常见拼写错误,顺便说一下)。你还在使用隐含的等待吗?如果是这样,the docs声明不要混合使用。

      

    警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。

    如果是,请删除隐式等待,看看是否有帮助。

  2. 接下来我会尝试一些时间。在每个步骤之间添加一个时间点,以查看长时间等待的位置。有了这些信息,您就可以更好地了解延迟的来源以及如何解决这些问题。

  3. 您正在等待装载程序隐藏得比我认为必要的更多。这应该没关系,但删除其中一些可能会有所帮助,特别是如果您使用隐式等待(请参阅#1)。你抓住SELECT后等待它,这是不需要的。你在else的第一行再次等待它,但你没有做任何应该触发加载器的事情。从下拉列表中选择项目后,唯一合理的地方是第3个实例。

  4. 您是否尝试按值而非可见文字进行选择?这可能没关系,但我不确定它是如何找到可见文本的。

  5. 另一种选择是完全避免使用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