繁体   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