Не удается получить данные из консоли во время теста на Java (TestNG)

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

 @Test
public void AddPatientToArchive() throws IOException {
    File file = new File("src/test/resources/chromedriver.exe");
    System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
    WebDriver driver = new ChromeDriver();
    driver.navigate().to("https://cardiopro.mts.ru");
    WebElement phoneField = driver.findElement(By.xpath("//input[@name='login']"));
    phoneField.sendKeys("");  //тут номер телефона
    WebElement furtherButton = driver.findElement(By.xpath("//span[@class='button__content']"));
    furtherButton.click();
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter code from SMS:");
    String code = scan.nextLine();
    WebElement codeGaps = driver.findElement(By.xpath("//input[@class='codeCheckBlock__codeCheck codeCheck -hidden -hideButton']"));
    codeGaps.sendKeys(code);
}

ввод


Ответы (1 шт):

Автор решения: default locale

Вводить SMS

Вводить SMS при каждом запуске это довольно неудобное решение. Тесты пишутся для того чтобы они работали автоматически, без участия человека. Библиотеки тестов (TestNG в данном случае) подставляют свой поток ввода и поэтому считывать через System.in не получится.

Но если нужно только так и не иначе, то можно вывести тестировщику диалог для ввода SMS:

String code = JOptionPane.showInputDialog("Enter sms");

Диалог

Альтернатива: заглушка

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

Еще, если код сохраняется в БД, то можно получать его оттуда и игнорировать отправленное сообщение.

Альтернатива: получать SMS автоматически.

Также можно реализовать получение SMS в коде теста. Варианты можете посмотреть здесь: How to automate OTP using selenium web driver?. Приведу несколько здесь:

  • Подключить телефон к компьютеру и получать SMS через smslib либо appium.
  • Использовать сервисы автоматизации, например IFTTT, чтобы переслать SMS на более доступный для теста ресурс (email, файл и т.п.) и прочитать его оттуда.
  • Подключиться к SMS шлюзу и арендовать там SIM-карту или виртуальный номер.
→ Ссылка