Не могу ввести текст в поле password с помощью WebDriver

Здравствуйте,

У меня такая проблема что когда пытаюсь  ввести текст в поле password получаю следующую ошибку:

org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with

Получается что WebDriver находит поле password, но не может ввести в него текст. Мне кажется это потому что элемент имеет атрибут style="dispaly: none" который меняется на style="display: block" когда мы ставим фокус в это поле.

Вот собственно html элемента

<input id="j_password" class="itemText" type="password" name="j_password" maxlength="60" value="" style="display: none;">

а вот код, с помощью которого я достаю этот элемент:

WebElement passwordField = driver.findElement(By.id("j_password"));
passwordField.sendKeys("some text");

Есть ли какой нибудь способ, кроме использования JavascriptExecutor, чтобы все же ввести текст в это поле?

 

Сперва попробуйте вытащить какой то атрибут с элемента, например клаасс нейм, что б знать находит ли элемент вообще

css locator заюзать можно тогда, если так не находит. 

было похожее:

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

 

<input id="txtPlainPassword" class="text1" type="text" onfocus="return plainPasswordOnFocus(this.id);" value="Enter a password..." style="color: rgb(102, 102, 102); display: block;">

<input id="Password" class="text1" type="password" onblur="return passwordOnBlur(this.id);" name="Password" style="display: none;" autocomplete="off">

 

после клика по  id="txtPlainPassword":

 

<input id="txtPlainPassword" class="text1" type="text" onfocus="return plainPasswordOnFocus(this.id);" value="Enter a password..." style="color: rgb(102, 102, 102); display: none;">

<input id="Password" class="text1" type="password" onblur="return passwordOnBlur(this.id);" name="Password" style="display: block;" autocomplete="off">

 

таким образом кликаешь сначала по по первому(txtPlainPassword) но пароль вводишь во второе(Password)

 

тут вся проблема, как мне кажется в спецфики приложения

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

или же он скрыт под другим элементом, который его закрывает

попробуйте происследовать руками, что происходит на уровне html, когда вы вводите свой пароль

Он скорее скрыт под другим но сделать так как писал пользователь zc84 не получится потому что там только одна айдишка для поля password вне зависимости который у нее style

Когда я делаю фокус в поле пароля то style="display: none;" становится style="display: block;" и становится видимим. После этого по идеи я бы смог в него ввести текст с помощью WebDriver.

 

а сначала password.клик и потом password.sendkeys не работает?

та стучите в ту айдишку которая видима

Если по какой либо причине у вас случаются такие глюки проще(быстрее, надежнее) сделать все яваскриптом, что то вроде:

(driver as IJavaScriptExecutor).ExecuteAsyncScript("document.getElementById("id_here").value='123';");

Правда все зависит от того что именно вы тестируете, сам контрол ввода пароля или всю страницу

Не работает потому что элемент невидимый 

Та я то стучусь. Проблема в том, что вебдрайвер не хочет работать с невидимым элементом

Вопрос как раз в том можно ли это сделать без JavascriptExecutor 

а ви кроме By.id что то другое пробовали ?

можно тогда перед действией изменить через javascript нужный вам элемент, а дальше уже с ним работать.

если элемент в состоянии невидимости, то вы ничего не сможете с ним сделать

Из того что я уже успел увидеть - написать тесты для более мение большого проекта с "хитрыми" контролами не используя JS - просто не возможно, и вместе с тем я не вижу причин почему это должно смущать тестировщика записывающего тест (при условии что мы тестим не сам контрол - для этого есть тулы типа qunit)

да, чтот затупил:)

 

но в любом случае должен быть элемент, который даёт команду сделать display block для вашего поля, после некоторого user action с ним, по другому я как то даж и представить не могу реализцию.

Если есть возможность, дайте линку на страницу или сорс её, может так что нить проясниться. в противном случае никуда без джава скрипта аля styel.display = block

 Вы пробовали сначала через action сделать так чтобы display: none поменялся на display: block?

Гугл подсказал следующее.

 

You have a couple of options.

Use the Actions implementation:

WebElement myElement =driver.findElement(By.xpath("//foo"));

Actions builder = new Actions(driver);

builder.moveToElement(myElement).build().perform();

Dive into the guts of selenium and hjack the Mouse implementation instead of using it via the Actions implementation:

Locatable hoverItem = (Locatable) driver.findElement(By.xpath("//foo"));

Mouse mouse = ((HasInputDevices) driver).getMouse();

mouse.mouseMove(hoverItem.getCoordinates());

 

Хорошо, оставлю имплементацию з Javascript. С ним все хорошо работает

Всем спасибо

Сам сталкиваюсь с подобным в формах. Убедись, что курсор на поле не стоит и бери его локатор, бери этот элемент (обычно там полупрозрачный текст в духе "введите пароль"), кликай в него, бери локатор поля с установленным курсором и вводи пароль.

edit: У злых разработчиков случаются одинаковые ID на странице, а вэбдравер хватает естественно первый (если by.ID)

edit2: Вот две строки из теста, что делал вчера:

driver.find_element_by_xpath(".//*[@id='comment_work_line']//textarea[@class='undefined empty']").click()

driver.find_element_by_xpath(".//*[@id='comment_work_line']//textarea[@id='comment_work']").send_keys(opinion)

с одинаковыми id, лучьше и правильнее всего бороться css локаторами вроде:

#my-input[type=password]

тем самым автоматом отсеится все не нужное