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

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

element.sendKeys("");

или

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

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

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

5 ответов


следующий код -

element.sendKeys("");

пытается найти поле ввода тегов для ввода некоторой информации, в то время как

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

более подходит, поскольку он будет работать для элементов изображения, элементов ссылок,выпадающих окон и т. д.

используя moveToElement() метод имеет смысл сосредоточиться на любом общем веб-элементе на веб-странице.

в поле ввода вам придется нажмите кнопку() на элементе нужно сосредоточиться.

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

FWIW, у меня было то, что я считаю связанной проблемой, и придумал обходной путь: я написал расширение Chrome, которое сделало документ.execCommand ('paste') в textarea с фокусом на выгрузке окна, чтобы заполнить элемент содержимым системного буфера обмена. Это работало 100% времени вручную, но execCommand возвращал false почти все время при запуске под Selenium.

Я добавил водитель.refresh () после начального драйвера.получить (myChromeExtensionURL ), и теперь это работает 100% времени. Это было с Selenium driver версии 2.16.333243 и Chrome версии 43 на Mac OS 10.9.

когда я исследовал проблему, я не видел никаких упоминаний об этом обходном пути, поэтому я подумал, что документирую свое открытие для тех, кто следует по моим шагам Selenium/focus/execCommand('paste').


фокус работает только если окно в фокусе.

использовать ((JavascriptExecutor)webDriver).executeScript("window.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();");