使用Java将元素集中在Selenium WebDriver中的正确方法

时间:2012-07-05 02:57:25

标签: java focus selenium-webdriver setfocus

WebDriver的selenium.focus()相当于什么?

element.sendKeys("");

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

我已经尝试了他们两个并且他们工作了,但哪一个总是适用于所有元素?

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

7 个答案:

答案 0 :(得分:53)

以下代码 -

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();

}

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

答案 1 :(得分:11)

您可以使用以下JS:

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

答案 2 :(得分:1)

FWIW,我认为这是一个相关的问题并提出了一个解决方法:我写了一个Chrome扩展程序,它将document.execCommand('paste')写入textarea,重点放在窗口卸载上,以便填充元素与系统剪贴板内容。这种方式100%手动工作,但execCommand几乎一直在Selenium下运行时返回false。

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

此代码实际上并未提供焦点:

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

它提供了悬停效果。

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

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

我发现此代码有效:

element.sendKeys(Keys.SHIFT);

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

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

答案 5 :(得分:0)

我们还可以使用以下代码集中网络元素:

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);
}

希望它会有所帮助:)

答案 6 :(得分:0)

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);