Подтвердить что ты не робот

Правильный способ сфокусировать элемент в Selenium WebDriver с помощью Java

Что эквивалентно selenium.focus() для WebDriver?

element.sendKeys("");

или

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

Я пробовал оба из них, и они работали, но который всегда будет работать на всех элементах?

Какой из них является правильным способом для любых элементов (например, кнопки, ссылки и т.д.)? Это имеет значение для меня, потому что функция будет использоваться для разных пользовательских интерфейсов.

4b9b3361

Ответ 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);
}

Надеюсь, это поможет :)