Необычная проблема с входом на веб-сайт с помощью VBA и Selenium WebDriver

#javascript #excel #vba #selenium-chromedriver

#javascript #excel #vba #selenium-chromedriver

Вопрос:

Я использовал макросы VBA в Excel 2016 вместе с Chrome и Selenium WebDriver для входа на многие разные веб-сайты, но мне не удалось войти на веб-сайт, показанный в следующем коде.

 ' Open the "AARP" web page
WDriver.Start "chrome"
WDriver.Window.Maximize
WDriver.Get "https://www.medicare.uhc.com/AARP"

Application.Wait (Now   TimeValue("0:00:05"))   

' Click the "Sign In" button
WDriver.FindElementByXPath("/html/body/div[4]/div/div[1]/div[2]/div/div/div/main/section/div/div[1]/div/button[1]").Click

' Wait until the page is fully loaded
Application.Wait (Now   TimeValue("0:00:10"))

' Login
WDriver.FindElementById("EMAIL").SendKeys ("")     ' focus
WDriver.FindElementById("EMAIL").SendKeys ("abc")
Application.Wait (Now   TimeValue("0:00:02"))

WDriver.FindElementById("PASSWORD").SendKeys ("")  ' focus
WDriver.FindElementById("PASSWORD").SendKeys ("123")
Application.Wait (Now   TimeValue("0:00:02"))

WDriver.FindElementById("submitBtn").Click

' Do stuff
  

Я вижу, что адрес электронной почты и ПАРОЛЬ введены правильно, но при нажатии кнопки отправки я получаю следующее сообщение об ошибке с веб-сайта: «Ошибка: введенная комбинация имени пользователя и пароля не соответствует нашим записям».

Исходный код для поля ввода электронной почты

 <input id="EMAIL" class="form-control ng-pristine ng-empty ng-invalid ng-invalid-required ng-touched" type="text" name="EMAIL" ng-model="sm.userInput" placeholder="" required="required" ng-blur="isValidUserNameEmail()" aria-invalid="true" style="">
  

Исходный код для поля ввода ПАРОЛЯ очень похож.

Знакомый предположил, что мне нужно использовать javascript (executeScript), а затем вызвать «isValidUserNameEmail ()» после установки электронной почты.

Я не знаю, как выполнить этот шаг, и был бы признателен за помощь в написании кода этого шага. Кроме того, что именно делает код «isValidUserNameEmail ()»? Есть ли способ сделать это без использования javascript?

Заранее спасибо за вашу помощь … Рон

Ответ №1:

Я отвечу на вторую часть о what exactly is the "isValidUserNameEmail()" code doing :

Как вы, вероятно, можете догадаться из названия, он выполняет проверку поля пользовательского ввода, из которого он вызывается через событие angular ng-blur .

Большую часть того, что вам нужно знать, вы можете найти в файле js https://www.healthsafe-id.com/controllers/login/login-ce5235a2c825372facef0f2b619e467a.js .

Определение функции находится в строке 624. Вы увидите, что он вызывает пользовательскую функцию, которая проверяет, пусто ли поле. Он использует условный троичный оператор (?), Чтобы решить, что делать, основываясь на результате теста is empty. Если пусто, он ищет сохраненное значение, в противном случае он ищет ввод пользователя. В любом случае, он присваивает значение переменной, которую затем передает обратно той же функции, чтобы проверить, остается ли она пустой, т. '' Е.. Если нет, вам '' присваивается, если да, оно присваивается piEMAILError значению, возвращаемому из пользовательской функции (компонент AEM от Optum. Объединенный партнер). Он передается в EMUsernameRequired качестве keyAEM аргумента.

В этой вызывающей функции есть ряд других вызовов функций, например, строка 208 и строка 218. Результатом этого является возврат ответов по умолчанию, как описано в https://www.healthsafe-id.com/content/healthsafeid/aarp/signin?HTTP_LANGUAGE=en .

В приведенной выше ссылке вы найдете Username is required значение по умолчанию, связанное с ключом EMUsernameRequired_v2 и The username and password combination entered does not match our records связанным с SigninFailedNoRecord_v2 . Последнее, которое вы получаете в данный момент, подразумевает, что значения либо неверны, либо не распознаны.

Он угловой, поэтому все довольно запутанно, и вы можете продолжать копать и отслеживать, но некоторые решения, вероятно, принимаются на стороне сервера. По сути, начальная функция вызывается, когда поле ввода теряет фокус.


Для перехода на страницу входа в систему было бы надежнее использовать короткий css-селектор, чем длинный xpath, например

 .FindElementByCss(".login button").click
  

Комментарии:

1. Как вы определили «.login button» в качестве селектора css, я не вижу его в исходном коде?

2. существует элемент button с родительским элементом, который имеет логин класса (это то, что означает селектор). Попробуйте открыть инструменты разработчика браузера на странице (F12), затем на вкладке «Элементы» нажмите Ctrl F и поместите кнопку .login в поле поиска и нажмите enter.

3. Я вижу логин класса, но при поиске я получаю «совпадений не найдено» в Chrome.

4. могу ли я получить URL-адрес, который вы используете в данный момент? Возможно, я заканчиваю с другим

5. Ах, я использовал другой поиск (тот, что в разделе «Настройка и управление инструментами разработчика»). Теперь я вижу это, спасибо, что работаете со мной.