使用Java的Selenium WebDriver正确聚焦元素的方法

57

WebDriver中等价于selenium.focus()的方法是什么?

element.sendKeys("");
或者
new Actions(driver).moveToElement(element).perform();

我已经尝试过这两种方法并且它们都有效,但哪一种可以在所有元素上始终起作用呢?

哪一种是适用于任何元素的正确方式(例如按钮、链接等)?这对我很重要,因为该函数将用于不同的用户界面。

7个回答

68
以下代码 -
element.sendKeys("");
试图查找一个输入框标签来输入一些信息,而
new Actions(driver).moveToElement(element).perform();
更加适合,因为它可以在图像元素、链接元素、下拉框等情况下使用。
因此,使用moveToElement()方法更有意义,可以聚焦于网页上的任何通用WebElement。
对于输入框,您需要click()元素进行聚焦。
new Actions(driver).moveToElement(element).click().perform();
而对于链接和图片,鼠标将悬停在该特定元素上,您可以根据自己的需求决定是否要click()它。
如果在输入标签上click()不起作用 -
由于您希望该函数是通用的,因此首先通过以下方式检查webElement是否为输入标签 -
if("input".equals(element.getTagName()){
   element.sendKeys("");
} 
else{
   new Actions(driver).moveToElement(element).perform();

}

你可以根据自己的喜好进行类似的更改。


1
@questions "element.sendKeys(""); 尝试查找一个输入标签框以输入一些信息" ... 这个说法是 _绝对不正确的_。 sendKeys() 获取元素的焦点(此外,如果该元素是 input,它会将光标移到已有文本的末尾),然后在元素上按键(或模拟按键)。我认为这两种方法都可以工作,moveToElement() 更清晰易读,但 sendKeys() 也不会让你失望。 - Petr Janeček
我该如何验证文本字段上是否存在焦点/光标? - Ripon Al Wasim
对于C#,可以这样编写上面的代码: if(“input”==(element.TagName)) { element.SendKeys(“”); } 否则 { new Actions(Driver)。MoveToElement(element)。Perform(); }//其中 Driver == new ChromeDriver()|| new FirefoxDriver()|| 等。 - Arsen Khachaturyan
Safari不支持moveToElement,但支持element.sendKeys()。这是使用element.sendKeys()进行Safari测试的一个很好的理由。 - jdhildeb
我最初选择sendKeys是因为它更简单,但是当输入使用自定义JavaScript下拉菜单时,我发现它会导致Firefox出现意外行为。不过,moveToElement方法确实有效。 - frodo2975

18

您可以按以下方式使用JS:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");

7

这段代码实际上并没有提供焦点:

new Actions(driver).moveToElement(element).perform();

它提供了一种悬停效果。

此外,JS代码.focus()需要窗口处于活动状态才能正常工作。

js.executeScript("element.focus();");

我发现这段代码有效:

element.sendKeys(Keys.SHIFT);

对于我的代码,我两者都使用:

element.sendKeys(Keys.SHIFT);
js.executeScript("element.focus();");

它是提供悬停还是将窗口移动(或滚动)到元素? - Paulo Costa

4

只有窗口聚焦时,才能使用聚焦功能。

使用((JavascriptExecutor)webDriver).executeScript("window.focus();");确保聚焦。


谢谢,这解决了我的问题,即jQuery日期选择器在Firefox中无法打开。 - Floyd

2

顺带一提,我曾经也遇到了一个类似的问题,并想出了一个解决方法:我编写了一个谷歌浏览器扩展,在窗口卸载时使用document.execCommand('paste')将内容粘贴到textarea中,以使该元素填充系统剪贴板中的内容。这个方法在手动操作时可以100%正常工作,但是在Selenium下运行时,execCommand 几乎总是返回false。

我在driver.get(myChromeExtensionURL)之后添加了一个driver.refresh(),现在它可以100%正常工作了。这是在Mac OS 10.9上使用Selenium driver版本2.16.333243和Chrome版本43进行测试的。

当我在研究这个问题时,我没有看到任何关于这种解决方法的说明,所以我想记录一下我发现的东西,为那些跟随我的Selenium/focus/execCommand('paste')脚步的人做出贡献。


2

C#扩展方法代码,聚焦元素,输入文本,调用change()。

public static void EnterText(this IWebDriver driver, IWebElement element, string textToEnter)
    {
        var js = (IJavaScriptExecutor)driver;
        js.ExecuteScript("arguments[0].focus();", element);
        js.ExecuteScript("arguments[0].setAttribute('value', arguments[1])", element, textToEnter);
        js.ExecuteScript("$(arguments[0]).change();", element);
    }

调用者:

driver.EnterText(element, text);

0
我们可以使用以下代码来聚焦到webelement:
public focusElement(WebElement element){
    String javaScript = "var evObj = document.createEvent('MouseEvents');"
                    + "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);"
                    + "arguments[0].dispatchEvent(evObj);";

            ((JavascriptExecutor) getDriver()).executeScript(javaScript, element);
}

希望能有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接