Правильный способ сфокусировать элемент в Selenium WebDriver с помощью Java
Что эквивалентно selenium.focus()
для WebDriver?
element.sendKeys("");
или
new Actions(driver).moveToElement(element).perform();
Я пробовал оба из них, и они работали, но который всегда будет работать на всех элементах?
Какой из них является правильным способом для любых элементов (например, кнопки, ссылки и т.д.)? Это имеет значение для меня, потому что функция будет использоваться для разных пользовательских интерфейсов.
Ответы
Ответ 1
Следующий код -
element.sendKeys("");
пытается найти поле ввода-тега для ввода некоторой информации, а
new Actions(driver).moveToElement(element).perform();
более подходит, поскольку он будет работать для элементов изображения, элементов ссылок, выпадающих списков и т.д.
Поэтому использование метода moveToElement() имеет смысл сосредоточиться на любом универсальном WebElement на веб-странице.
В поле ввода вам нужно будет щелкнуть() для фокусировки элемента.
new Actions(driver).moveToElement(element).click().perform();
в то время как для ссылок и изображений мышь будет над этим конкретным элементом, вы можете выбрать для него щелчок() в зависимости от того, что вы хотите сделать.
Если щелчок() на теге ввода не работает -
Поскольку вы хотите, чтобы эта функция была общей, вы сначала проверяете, является ли webElement входным тегом или нет -
if("input".equals(element.getTagName()){
element.sendKeys("");
}
else{
new Actions(driver).moveToElement(element).perform();
}
Вы можете сделать подобные изменения в зависимости от ваших предпочтений.
Ответ 2
Вы можете использовать JS, как показано ниже:
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");
Ответ 3
Фокус работает только в том случае, если окно сфокусировано.
Используйте ((JavascriptExecutor)webDriver).executeScript("window.focus();");
, чтобы убедиться.
Ответ 4
FWIW, у меня было то, что я считаю связанной проблемой, и придумал обходной путь: я написал расширение Chrome, которое сделал document.execCommand('paste') в текстовое поле с акцентом на выгрузку окна, чтобы заполнить элемент с содержимым системного буфера обмена. Это работало в 100% случаев вручную, но execCommand возвращал false почти все время, когда выполнялся под Selenium.
Я добавил driver.refresh() после первоначального driver.get(myChromeExtensionURL), и теперь он работает 100% времени. Это было с драйвером Selenium версии 2.16.333243 и Chrome версии 43 на Mac OS 10.9.
Когда я изучал проблему, я не видел упоминаний об этом обходном пути, поэтому я думал, что буду документировать свое открытие для тех, кто приведен в моих шагах Selenium/focus/execCommand ( "paste" ).
Ответ 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();");
Ответ 6
Мы также можем сфокусировать 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);
}
Надеюсь, это поможет :)