t.me/atinfo_chat Telegram группа по автоматизации тестирования

Не отправляется email на почту в headless chrome mode

Теги: #<Tag:0x00007fd776e95db8> #<Tag:0x00007fd776e95cf0> #<Tag:0x00007fd776e95c28> #<Tag:0x00007fd776e95b60> #<Tag:0x00007fd776e95a98>

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

Когда прогоняю тест не в headless режиме, то тест работает идеально: высылается имейл, я захожу на почту, вытягиваю линку из имейла, перехожу по ней.

Когда пробую прогнать в headless режиме, то имейл на почту не отправляется :frowning:

Сам тест:
`
public class SignUp extends BaseTest {

@Override
protected String getUrl() {
    return Constants.stageUrl;
}


@Test
public void signUpSuccess() throws InterruptedException, MessagingException {
    SignUpPage signUp = new SignUpPage(driver);
    signUp.fillSignupForm();

    GmailInbox mailbox = new GmailInbox(Constants.emailUsername, Constants.emailPassword);
    RegistrationLink link = mailbox.findRegistrationLink().orElseThrow(() -> new RuntimeException("Link not found!"));
    driver.navigate().to(link.link);
    Thread.sleep(5000);
    Assert.assertEquals(Constants.stageUrl + "dashboard/settings", driver.getCurrentUrl());
    Assert.assertEquals(Constants.title, driver.getTitle());
}

}`

Метод filSignupForm:
public SignUpPage fillSignupForm() throws InterruptedException { secondBlock.click(); thirdBlock.click(); clickUploadImage(); setEmail(newEmails()); setPassword(Constants.basicPass); checkbox.click(); Thread.sleep(1000); btnRegister.click(); return this; }

Возможно кто то сталкивался с такой проблемой?

Покажите что у вас в методе signUp.fillSignupForm() .

public SignUpPage fillSignupForm() throws InterruptedException {
secondBlock.click();
thirdBlock.click();
clickUploadImage();
setEmail(newEmails());
setPassword(Constants.basicPass);
checkbox.click();
Thread.sleep(1000);
btnRegister.click();
return this;
}

Добавьте проверку что у вас форма нормально отправилась/скрылась, после нажатия на кнопку btnRegister.click();
Скорее всего, логика теста не до конца корректна.

1 Симпатия

Попробую добавить, настораживает то, что только в headless падает тест :frowning:

Добавил проверку что после нажатия на кнопку btnRegister.click(); открывается ли новая модалка, что письмо отправлено, получается что не в headless все отлично проходит, а в headless не видит элемент этот:

`@Test

public void signUpSuccess() throws InterruptedException, MessagingException {
    SignUpPage signUp = new SignUpPage(driver);
    VerifyEmailModalPage verifyEmailModalPage = new VerifyEmailModalPage(driver);
    signUp.fillSignupForm();
    Thread.sleep(10000);
    Assert.assertEquals(true, verifyEmailModalPage.verifyEmailModalTitle.isDisplayed());
    verifyEmailModalPage.verifyEmailModalBtn.click();

`

И сама ошибка:
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {“method”:“xpath”,“selector”:"//div[@class=‘form letter-notification-wrapper’]//h2"}
(Session info: headless chrome=73.0.3683.86)
(Driver info: chromedriver=2.46.628411 (3324f4c8be9ff2f70a05a30ebc72ffb013e1a71e),platform=Mac OS X 10.13.6 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
System info: host: ‘MacBook-Pro-Alexnot.local’, ip: ‘192.168.1.130’, os.name: ‘Mac OS X’, os.arch: ‘x86_64’, os.version: ‘10.13.6’, java.version: ‘1.8.0_161’
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.46.628411 (3324f4c8be9ff2…, userDataDir: /var/folders/s9/jkjw6xd901q…}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:62455}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, proxy: Proxy(), rotatable: false, setWindowRect: true, strictFileInteractability: false, takesHeapSnapshot: true, takesScreenshot: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior: ignore, version: 73.0.3683.86, webStorageEnabled: true}
Session ID: e4914ddd29de10ccd8991fc4e405f4d6
*** Element info: {Using=xpath, value=//div[@class=‘form letter-notification-wrapper’]//h2}

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy8.isDisplayed(Unknown Source)
at com.bo.SignUp.signUpSuccess(SignUp.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Возможно эта модалка не открывается после отправки формы, или же ее просто драйвер не видит?

  1. Добавьте взятие сриншота при ошибке для лучшего разбора.
  2. Ошибка говорит что элемент не найден, значит его нет, либо у него другой локатор.
  3. Обновите драйвер на соответвующий для вашей версии браузера.

Я думаю, что всё намного проще.
Когда-то тоже пробовал автоматизировать один сайт через headless режим, в итоге получилось понять следующее:
В Headless режиме просто напросто ничего не происходит при клике на кнопку. (Не на все - а на какую-то конкретную на всём сайте, в моём случае это был экспорт отчета в эксель).
Т.е. иными словами - хром просто не нажимает в этом режиме на кнопку, поэтому у вас ничего дальше и не происходит.

Почему хром не может кликнуть именно эту кнопку разбираться не стал.

Спасибо за ответ, как вы думаете , если запускать не в headless, а установить xfvb plugin в Jenkins это поможет решить проблему?

Попробуй кликнуть с помощью javascript

private void JsClick(By by)
{
     ((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].click()", Driver.FindElement(by));
}

Та же ошибка :pensive:

Я гоняю тесты через докер, там как раз поднимается контейнер с xfvb, и проблем нет.