webdriver中的多个动作系列

时间:2016-05-26 19:38:25

标签: java selenium webdriver

我只是尝试使用一组键盘操作输入大写字母的文本。这里的代码使用接口'Action':

WebElement element = driver.findElement(By.id("email")); 
Actions builder = new Actions(driver); 
Action act = builder.moveToElement(element)
                    .keyDown(element,Keys.SHIFT)
                    .sendKeys("vishal")
                    .keyUp(Keys.SHIFT)
                    .build();
act.perform();

以上工作正常。

但是,如果我们不使用接口,它不工作为什么???虽然这样做很好但没有执行任务。我认为两者都应该有用。

WebElement element = driver.findElement(By.id("email")); 
Actions builder = new Actions(driver);
builder.moveToElement(element)
       .keyDown(element,Keys.SHIFT)
       .sendKeys("vishal")
       .keyUp(Keys.SHIFT)
       .build();
builder.perform();

3 个答案:

答案 0 :(得分:1)

在你的第二个例子中,因为你正在调用 build()然后执行()

如果你看一下这两种方法的Actions类实现:

  /**
   * Generates a composite action containing all actions so far, ready to be performed (and
   * resets the internal builder state, so subsequent calls to build() will contain fresh
   * sequences).
   *
   * @return the composite action
   */
  public Action build() {
    CompositeAction toReturn = action;
    resetCompositeAction();
    return toReturn;
  }

  /**
   * A convenience method for performing the actions without calling build() first.
   */
  public void perform() {
    build().perform();
  }

当您致电 build()时,它实际上会重置构建器的内部状态!

之后,当您调用 perform()时,它会重建一个没有定义行为的空对象引用。

要解决此问题,我建议您通过调用执行()来取代对 build()的调用,如下所示。

 WebElement element = driver.findElement(By.id("email")); 
 Actions builder = new Actions(driver);
 builder.moveToElement(element).keyDown(element, Keys.SHIFT).sendKeys("vishal").keyUp(Keys.SHIFT).perform();

我希望根据实施情况做你想做的事。

  

我的调查是针对selenium v​​ 2.53.0进行的。

答案 1 :(得分:0)

因为Actions#build()方法在返回动作之前重置了自身的状态,所以 请参阅此处的实施:http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-api/2.18.0/org/openqa/selenium/interactions/Actions.java#Actions.build%28%29

338
339  public Action More ...build() {
340    CompositeAction toReturn = action;
341    resetCompositeAction();
342    return toReturn;
343  }

注意resetCompositeAction();调用 - 它会重置构建器。

如果您执行此操作:

 builder............
        ........ ().build();
builder.perform();

然后build()返回操作并重置builder对象的状态。
然后,如果您拨打builder.perform(),则无效。

答案 2 :(得分:0)

builder.moveToElement(element)
       .keyDown(element,Keys.SHIFT)
       .sendKeys("vishal")
       .keyUp(Keys.SHIFT)
       .build().perform();