Правильный способ фокусировки элемента в 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();");