56

selenium.focus()WebDriver的等价物是什么?

element.sendKeys("");

或者

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

我已经尝试了这两种方法并且它们都有效,但是哪一种总是适用于所有元素?

哪一种是任何元素(如按钮、链接等)的正确方式?这对我很重要,因为该功能将用于不同的 UI。

4

7 回答 7

66

以下代码 -

element.sendKeys("");

试图找到一个输入标签框来输入一些信息,而

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

更合适,因为它适用于图像元素、链接元素、下拉框等。

因此,使用moveToElement()方法更有意义地关注网页上的任何通用 WebElement。

对于输入框,您必须在要聚焦的元素上单击()

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

而对于链接和图像,鼠标将位于该特定元素上,您可以根据自己的需要决定单击()它。

如果输入标签上的 click() 不起作用 -

由于您希望此函数具有通用性,因此您首先检查 webElement 是否为输入标签 -

if("input".equals(element.getTagName()){
   element.sendKeys("");
} 
else{
   new Actions(driver).moveToElement(element).perform();

}

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

于 2012-07-05T04:51:11.647 回答
16

您可以使用 JS 如下:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");
于 2013-01-28T10:48:07.953 回答
5

此代码实际上不提供焦点:

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

它提供了悬停效果。

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

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

我发现这段代码有效:

element.sendKeys(Keys.SHIFT);

对于我自己的代码,我同时使用:

element.sendKeys(Keys.SHIFT);
js.executeScript("element.focus();");
于 2018-06-06T18:13:05.023 回答
3

仅当窗口获得焦点时,焦点才有效。

使用((JavascriptExecutor)webDriver).executeScript("window.focus();");确定。

于 2017-02-02T16:25:08.123 回答
2

FWIW,我遇到了我认为相关的问题并想出了一个解决方法:我编写了一个 Chrome 扩展程序,它在一个 textarea 中执行了一个 document.execCommand('paste'),重点是窗口卸载,以便用系统剪贴板内容。这在 100% 的时间里都是手动工作的,但是当在 Selenium 下运行时,execCommand 几乎总是返回 false。

我在最初的 driver.get(myChromeExtensionURL) 之后添加了一个 driver.refresh(),现在它可以 100% 工作。这适用于 Mac OS 10.9 上的 Selenium 驱动程序版本 2.16.333243 和 Chrome 版本 43。

当我研究这个问题时,我没有看到任何关于这个解决方法的提及,所以我想我会记录我的发现,以供那些跟随我的 Selenium/focus/execCommand('paste') 脚步的人使用。

于 2015-07-04T17:56:40.010 回答
1

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);
于 2020-10-01T12:29:26.510 回答
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);
}

希望能帮助到你 :)

于 2019-07-26T13:41:35.937 回答