Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не срабатывает аннотация FindsBy (С# + webdriver)


(Serhii) #1

Использую PageFactory в тестах
Не срабатывает аннотация поиска елемента
поиск елемента:

    [FindsBy(How = How.Id, Using = "account")]
    [FindsBy(How = How.Id, Using = "Password")]
    public IWebElement PasswordField;

в тесте падает если обращаюсь к этому елементу (пробую очистить)

 page.PasswordField.Clear();

Ошибка

Clear failed at: ‘https:/Client/Registration’, calling element: ‘By.Id: account’
----> System.InvalidOperationException : Element must be user-editable in order to clear it.

т.е webdriver пробует очистить родительский елемент .
В чем я ошибся при написании FindsBy?


(sidelnikovmike) #2

может быть вы не к input обращаетесь? Достаточно сложно понять, что за элемент без кода страницы. Хотя бы его куска.


(Sergey Ivanskoy) #3

согласен с предыдущим оратором.

С чего вы взяли что не срабатывает аннотация? Посмотрите на выброшенное исключение - попытка произвести недопустимую операцию над элементом


(Serhii) #5

искомый елемент

<div class="col-sm-4"><input id="Password" class="form-control" type="password" name="Password" data-val-required="Wymagane jest nowe hasło" data-val-regex-pattern="^[0-9a-zA-ZàáâäãåąćęèéêëìíîïłńòóôöõøùúûüÿýżźñçčšžÀÁÂÄÃÅĄĆĘÈÉÊËÌÍÎÏŁŃÒÓÔÖÕØÙÚÛÜŸÝŻŹÑßÇŒÆČŠŽ∂ð]*$" data-val-regex="Nowe hasło zawiera niedozwolone znaki" data-val-length-min="4" data-val-length-max="64" data-val-length="Powinien być między {0} ta {1} symbolami" data-val="true"/></div>

родительский елемент
div id=“account” не являеться полем input ,но я к нему и не обращась. он содержит форму в которой есть поле password, которое я и хочц очистить и ввести данные. Но почему-то очистить пытаеться родительский елемент судя с выдаваемой ошибки


(Sergey Korol) #6

Чтение FAQ очень упростит процесс вставки html верстки в сообщениях. :wink:


(Serhii) #7

я отформатировал как код ctrl+k.но на html не сработало , т.к мой кусок html отрисовался браузером.


(Sergey Korol) #8

Вы лишь подтвердили факт непрочтения FAQ.


(sidelnikovmike) #9

Если я не ошибаюсь - то вы на поле 2 аннотации навесили(я не силен в c# и может быть мне показалось)? Если так - у Вас , возможно, первая берется и всё.


(Serhii) #10

Так собственно я и хочу по цепочке FindsBy обратиться сначала к родительскому елементу , а потом за счет [FindsBy(How = How.Id, Using = “Password”)] уже в нем обраться к дочернему.
Я гуглил и нашел такой принцип записи, но видимо что-то не учел. Если кто пишет на c# и использует цепочки поиска елементов, то сможет мне подтвердить работает эта фича или нет.


(Serhii) #11

тем не менее , в комментарии выше я отформатировал как код. или есть специылные теги для html’а? в FAQ я их не нашел


(Sergey Korol) #12

No comments.

Или же можно вставить код, а потом до и после вставить (3) ``` строки для форматирования кода.

Можно еще указать какой язык вы показываете, чтобы подсветка была точно правильной

Извините, что лично для вас не указали пример с html, вместо python.


(Максим Малунов) #13
Так собственно я и хочу по цепочке FindsBy обратиться сначала к родительскому елементу , а потом за счет [FindsBy(How = How.Id, Using = "Password")] уже в нем обраться к дочернему.
Я гуглил и нашел такой принцип записи, но видимо что-то не учел.

Можно попросить ссылку на данную запись .

по решению задачи . на Java

@FindBy(xpath = "//h1[@data-navigation-link]")
    private WebElement pageHeader;

и потом в нем

pageHeader.findElement()

(sidelnikovmike) #14

Не очень понял, зачем цепочка. Почему сразу не искать по id=Password? Только один такой элемент на странице может быть.


(Serhii) #15

елементов с id=Password на странице два.
я переделал поиск и нахожу его по XPath. Но было интересно найти именно по цепочке родитель - вложенный елемент. Но похоже эта фича не работает для C#. Вот это и хочу прояснить для себя.


(sidelnikovmike) #16

2 элемента с одним и тем же id?
“Ваши пчелы дают какой-то неправильный мед”.
Id уникален, в этом его прелесть.
есть вариант, что у вас внутри страницы есть iframe , и в нем есть елемент со схожим id.
А вообще , css например позволит так же найти через локатор “#account #Password”, но повтроюсь - с id все должно быть проще.
Насчет цепочки - что это за цепочка такая? В java например такая конструкция из 2х аннотаций не скомпилится.
Где-то видится подвох в Вашем вопросе)))


(Максим Малунов) #17
есть вариант, что у вас внутри страницы есть iframe , и в нем есть елемент со схожим id. 

Имхо без переключения в iframe так не получиться .


(Serhii) #18

ничего страшного. зато теперь думаю добавите.


(Serhii) #19

Я не смогу подробно обьяснить, но в общем - еэлементам присваиваеться Id с помощью мапперов (С# разработчики поймут). И на странице таких элементов может быть двое, никтьо не мешает этого сделать , браузеры так точно. Но в моем случае на странице регистрации есть 2 поля с одинокывм id, это форма логина и сама форма регистрации.
@maxmalunov
вот линка [Заметка] [C#] Атрибут [FindsBy] в PageObject? – Дайте два!
но там немного другое, то что интересно было мне это вот такой подход

    [FindsBySequence]
    [FindsBy(How = How.Id, Using = "account", Priority = 0)]
    [FindsBy(How = How.Id, Using = "Password", Priority = 1)]
    public IWebElement PasswordField;

получилось как всегда, сам задал вопрос и сам на него ответил. правда еще получил немного малоинтересующей информации от модератора) видимо скучно ему


(sidelnikovmike) #20

Разумеется. Вообщем еще более удивительно становится :smile:


(Serhii) #21

ну да с# это вам не java