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

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

element.sendKeys("");

или же

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

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

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

Ответы на вопрос(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();");

Вы можете использовать JS, как показано ниже:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.getElementById('elementid').focus();");

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

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

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

Решение Вопроса

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

element.sendKeys("");

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

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

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

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

Для поля ввода вам придетсяclick() на элементе, чтобы сосредоточиться.

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

в то время как для ссылок и изображений мышь будет находиться над этим конкретным элементом, вы можете решить щелкнуть () по нему в зависимости от того, что вы хотите сделать.

If the click() on an input tag does not work -

Поскольку вы хотите, чтобы эта функция была универсальной, вы сначала проверяете, является ли webElement входным тегом или нет -

if("input".equals(element.getTagName()){
   element.sendKeys("");
} 
else{
   new Actions(driver).moveToElement(element).perform();

}

Вы можете внести аналогичные изменения в зависимости от ваших предпочтений.

 05 июл. 2012 г., 13:14
@questions & quot;element.sendKeys(""); пытается найти поле ввода тега для ввода некоторой информации & quot; ... Это утверждениеdefinitely not true,sendKeys() получает фокус элемента (дополнительно, если этот элементinput, он перемещает курсор в конец уже существующего текста), затем нажимает клавиши (или имитирует) над элементом. Я думаю, что оба подхода должны работать,moveToElement() спорно чище и более удобным для чтения, ноsendKeys() и тебя тоже не подведет.
 questions05 июл. 2012 г., 07:51
Это работает и для полей ввода?
 questions05 июл. 2012 г., 08:10
Это должно работать. Спасибо, приятель! :)
 05 июл. 2012 г., 13:39
@Slanec, пожалуйста, вы можете отредактировать мой ответ, если я ошибаюсь.
 05 июл. 2012 г., 08:07
Дайте мне знать, если мой отредактированный ответ поможет?

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

использование((JavascriptExecutor)webDriver).executeScript("window.focus();"); чтобы быть уверенным.

Ваш ответ на вопрос