WebDriver中等价于selenium.focus()
的方法是什么?
element.sendKeys("");
或者new Actions(driver).moveToElement(element).perform();
我已经尝试过这两种方法并且它们都有效,但哪一种可以在所有元素上始终起作用呢?
哪一种是适用于任何元素的正确方式(例如按钮、链接等)?这对我很重要,因为该函数将用于不同的用户界面。
WebDriver中等价于selenium.focus()
的方法是什么?
element.sendKeys("");
或者new Actions(driver).moveToElement(element).perform();
我已经尝试过这两种方法并且它们都有效,但哪一种可以在所有元素上始终起作用呢?
哪一种是适用于任何元素的正确方式(例如按钮、链接等)?这对我很重要,因为该函数将用于不同的用户界面。
if("input".equals(element.getTagName()){
element.sendKeys("");
}
else{
new Actions(driver).moveToElement(element).perform();
}
你可以根据自己的喜好进行类似的更改。
您可以按以下方式使用JS:
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");
这段代码实际上并没有提供焦点:
new Actions(driver).moveToElement(element).perform();
它提供了一种悬停效果。
此外,JS代码.focus()需要窗口处于活动状态才能正常工作。
js.executeScript("element.focus();");
我发现这段代码有效:
element.sendKeys(Keys.SHIFT);
对于我的代码,我两者都使用:
element.sendKeys(Keys.SHIFT);
js.executeScript("element.focus();");
只有窗口聚焦时,才能使用聚焦功能。
使用((JavascriptExecutor)webDriver).executeScript("window.focus();");
确保聚焦。
顺带一提,我曾经也遇到了一个类似的问题,并想出了一个解决方法:我编写了一个谷歌浏览器扩展,在窗口卸载时使用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')脚步的人做出贡献。
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);
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);
}
element.sendKeys("");
尝试查找一个输入标签框以输入一些信息" ... 这个说法是 _绝对不正确的_。sendKeys()
获取元素的焦点(此外,如果该元素是input
,它会将光标移到已有文本的末尾),然后在元素上按键(或模拟按键)。我认为这两种方法都可以工作,moveToElement()
更清晰易读,但sendKeys()
也不会让你失望。 - Petr Janeček