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

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

email
headless
java
selenium
webdriver
Теги: #<Tag:0x00007f9c4d76ee18> #<Tag:0x00007f9c4d76ecb0> #<Tag:0x00007f9c4d76eb70> #<Tag:0x00007f9c4d76ea30> #<Tag:0x00007f9c4d76e8f0>

(Alex Somov) #1

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

Когда прогоняю тест не в 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; }

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


(Ugin Berets) #2

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


(Alex Somov) #3

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


(Vasiliy Rakshin) #4

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


(Alex Somov) #5

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


(Alex Somov) #6

Добавил проверку что после нажатия на кнопку 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)

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


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

(Alexandr D.) #8

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

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


(Alex Somov) #9

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


(Ihor Kokhan) #10

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

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

(Alex Somov) #11

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


(Alexandr D.) #12

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