我正在做许多测试,在这些测试中,我必须将值放入表格的168个输入字段中。目前,我正在使用这样的语句:

for (int i = 1; i < numberOfValues + 1; i++) {
  try {
      findingElement.byXPath(".//*[@id='TDCON']/tbody/tr[" + i + "]/td[4]/span/span[2]/span/span/input").sendKeys(Keys.chord(Keys.CONTROL, "a"), value);
  }catch (NoSuchElementException ex) {
            break;
   }
}


花费了很长时间才执行40个与此类似的测试。有没有使用Selenium WebDriver的更快方法?

最佳答案

执行时间与执行的命令数量成正比。因此,为了减少它,您可以通过一次调用选择所有元素。如果可能,还应该使用CSS选择器而不是XPath:

List<WebElement> elements = driver.findElements(By.cssSelector(
  "#TDCON > tbody > tr > td:nth-child(4) > span > span:nth-child(2) > span > span > input"));

for (int i = 0; i < numberOfValues; i++) {
  try {
      elements[i].sendKeys(Keys.chord(Keys.CONTROL, "a"), value);
  }catch (NoSuchElementException ex) {
            break;
  }
}


另一种方法是注入一段Javascript并直接分配.value属性:

((JavascriptExecutor)driver).executeScript(
  "var cells = arguments[0].querySelectorAll('#TDCON > tbody > tr > td:nth-child(4)'); " +
  "var values = arguments[1]; " +
  "for(var i = 0; i < values.length; ++i) { " +
  "  cells[i].querySelector('span > span:nth-child(2) > span > span > input').value = values[i]; " +
  "} "
  , findElement, values);


但是如果键入是由页面动态处理的,则可能无法正常工作。

08-05 13:25
查看更多