0

所以我一直试图解决这个问题几个小时。我不知道我做错了什么。

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

我无法让它在 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。显然是我太热心了。

4

3 回答 3

0

我认为您对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.

希望有帮助。

于 2017-02-18T20:11:35.007 回答
0

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

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

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

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

或者

actionObject.perform();

祝你好运!

于 2021-05-24T20:10:37.743 回答
0

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

WebElement ar=driver.findElement(By.id("id_attendees"));
Thread.sleep(1000);
ar.sendKeys(Keys.ARROW_DOWN);
于 2016-08-17T07:17:20.130 回答