【问题标题】:Getting Java Webdriver 'Down Arrow' action to work让 Java Webdriver '向下箭头' 动作起作用
【发布时间】:2012-08-10 02:24:57
【问题描述】:

所以我已经尝试了几个小时来解决这个问题。我不知道我做错了什么。

这是我正在查看的类型提前字段是<input type="text" id="id_attendees" name="attendees">。当我在那里输入时,会创建一个 js 下拉列表。当我按下键盘上的向下箭头时,它可以正常工作并选择首选。当我在 IDE 中执行 keyDown --- id=id_attendees --- \40 时,它工作正常并且还选择了选项。

我无法让它在 Java webdriver 中做同样的事情

Actions actionObject = new Actions(driver);
actionObject.sendKeys(Keys.ARROW_DOWN);

^不起作用。

driver.findElement(By.id("id_attendees")).sendKeys(Keys.ARROW_DOWN);

^不起作用

我在这两种情况下都尝试过 Keys.DOWN,但这也不起作用。我创建了一个字面值 String altm = "\u0040";,所做的只是输入一个 @ 符号。

我还尝试了很多其他方法,但没有任何效果。我不知道我错过了什么。

编辑 1:

@Roddy 谢谢! - 鉴于该链接,我添加了以下确实有效的内容(在导入 DefaultSelenium 和 WebDriverBackedSelenium 之后。

DefaultSelenium sel = new WebDriverBackedSelenium(driver,vars.siteurl);
sel.fireEvent("//input[@id='id_attendees']", "keydown");

编辑 2: --> 不起作用的 DOH。显然是我太热心了。

【问题讨论】:

  • 可能与正在填充/创建下拉菜单的 JavaScript 相关,而不是由您的输入触发(因此没有任何向下箭头的内容。 ) 也可以看看this question
  • 谢谢!这至少使它起作用,下次必须记住。从程序员的角度来看,您对如何避免它有任何想法吗?
  • 一般来说,如果您正在测试的任何内容中有某种 JavaScript 功能,您首先要确认您的测试逻辑实际上是触发 JavaScript。验证、回调、自动完成和表单通常是此类事情可能发生的地方,因此查看 JS 并了解它是如何被触发并相应地制定您的测试通常是一个好主意。

标签: java selenium webdriver keydown typeahead


【解决方案1】:

一些时间脚本需要一些时间来加载列表,所以需要添加等待,

WebElement ar=driver.findElement(By.id("id_attendees"));
Thread.sleep(1000);
ar.sendKeys(Keys.ARROW_DOWN);

【讨论】:

    【解决方案2】:

    我认为您对 Actions 的使用不太正确。

    实现是一种构建器模式。调用 sendKeys 不会发送事件,它只会在调用 perform 时暂存要触发的事件。请注意,sendKeys 的返回值是一个 Actions 实例。

    Actions actionObject = new Actions(driver);
    actionObject = actionObject.sendKeys(Keys.ARROW_DOWN); //ASSIGN the return or you lose this event.
    actionObject.perform();  //Should do what you want.  Note that this will reset the builder.
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      对于 Actions 类,在定义了它将为您做什么之后,您需要首先 build() 它。所以在你的情况下,它会是这样的:

      Actions actionObject = new Actions(driver);
      actionObject.sendKeys(Keys.ARROW_DOWN).build();
      

      当您希望脚本执行该操作时,您需要 perform() 它。您可以在您的 build() 方法之后(例如,如果您只使用它一次)或稍后在您需要它的代码中链接它,如下所示:

      actionObject.sendKeys(Keys.ARROW_DOWN).build().perform();
      

      actionObject.perform();
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        相关资源
        最近更新 更多