selenium.focus()
WebDriver的等价物是什么?
element.sendKeys("");
或者
new Actions(driver).moveToElement(element).perform();
我已经尝试了这两种方法并且它们都有效,但是哪一种总是适用于所有元素?
哪一种是任何元素(如按钮、链接等)的正确方式?这对我很重要,因为该功能将用于不同的 UI。
selenium.focus()
WebDriver的等价物是什么?
element.sendKeys("");
或者
new Actions(driver).moveToElement(element).perform();
我已经尝试了这两种方法并且它们都有效,但是哪一种总是适用于所有元素?
哪一种是任何元素(如按钮、链接等)的正确方式?这对我很重要,因为该功能将用于不同的 UI。
以下代码 -
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();
}
您可以根据自己的喜好进行类似的更改。
您可以使用 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();");
确定。
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') 脚步的人使用。
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);
我们还可以使用以下代码聚焦 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);
}
希望能帮助到你 :)