Skip to content

Commit

Permalink
stream #20 - selenide core
Browse files Browse the repository at this point in the history
  • Loading branch information
dtuchs committed Nov 11, 2024
1 parent be49e0a commit 60873f6
Show file tree
Hide file tree
Showing 9 changed files with 150 additions and 60 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package guru.qa.niffler.jupiter.extension;

import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideDriver;
import com.codeborne.selenide.WebDriverRunner;
import com.codeborne.selenide.logevents.SelenideLogger;
import io.qameta.allure.Allure;
Expand All @@ -14,17 +15,27 @@
import org.openqa.selenium.TakesScreenshot;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;

public class BrowserExtension implements
BeforeEachCallback,
AfterEachCallback,
TestExecutionExceptionHandler,
LifecycleMethodExecutionExceptionHandler {

private final List<SelenideDriver> drivers = new ArrayList<>();

public List<SelenideDriver> drivers() {
return drivers;
}

@Override
public void afterEach(ExtensionContext context) throws Exception {
if (WebDriverRunner.hasWebDriverStarted()) {
Selenide.closeWebDriver();
for (SelenideDriver driver : drivers) {
if (driver.hasWebDriverStarted()) {
driver.close();
}
}
}

Expand Down Expand Up @@ -54,14 +65,16 @@ public void handleAfterEachMethodExecutionException(ExtensionContext context, Th
throw throwable;
}

private static void doScreenshot() {
if (WebDriverRunner.hasWebDriverStarted()) {
Allure.addAttachment(
"Screen on fail",
new ByteArrayInputStream(
((TakesScreenshot) WebDriverRunner.getWebDriver()).getScreenshotAs(OutputType.BYTES)
)
);
private void doScreenshot() {
for (SelenideDriver driver : drivers) {
if (driver.hasWebDriverStarted()) {
Allure.addAttachment(
"Screen on fail for browser: " + driver.getSessionId(),
new ByteArrayInputStream(
((TakesScreenshot) driver.getWebDriver()).getScreenshotAs(OutputType.BYTES)
)
);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,33 @@
import com.codeborne.selenide.CollectionCondition;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideDriver;
import com.codeborne.selenide.SelenideElement;
import guru.qa.niffler.config.Config;
import io.qameta.allure.Step;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.$$;

@ParametersAreNonnullByDefault
public abstract class BasePage<T extends BasePage<?>> {

protected static final Config CFG = Config.getInstance();

private final SelenideElement alert = $(".MuiSnackbar-root");
private final ElementsCollection formErrors = $$("p.Mui-error, .input__helper-text");
private final SelenideElement alert;
private final ElementsCollection formErrors;

protected BasePage(SelenideDriver driver) {
this.alert = driver.$(".MuiSnackbar-root");
this.formErrors = driver.$$("p.Mui-error, .input__helper-text");
}

public BasePage() {
this.alert = Selenide.$(".MuiSnackbar-root");
this.formErrors = Selenide.$$("p.Mui-error, .input__helper-text");
}

public abstract T checkThatPageLoaded();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,41 @@
package guru.qa.niffler.page;

import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideDriver;
import com.codeborne.selenide.SelenideElement;
import io.qameta.allure.Step;

import javax.annotation.Nonnull;

import static com.codeborne.selenide.Condition.text;
import static com.codeborne.selenide.Condition.visible;
import static com.codeborne.selenide.Selenide.$;

public class LoginPage extends BasePage<LoginPage> {

public static final String URL = CFG.authUrl() + "login";

private final SelenideElement usernameInput = $("input[name='username']");
private final SelenideElement passwordInput = $("input[name='password']");
private final SelenideElement submitButton = $("button[type='submit']");
private final SelenideElement registerButton = $("a[href='/register']");
private final SelenideElement errorContainer = $(".form__error");
private final SelenideElement usernameInput;
private final SelenideElement passwordInput;
private final SelenideElement submitButton;
private final SelenideElement registerButton;
private final SelenideElement errorContainer;

public LoginPage(SelenideDriver driver) {
super(driver);
this.usernameInput = driver.$("input[name='username']");
this.passwordInput = driver.$("input[name='password']");
this.submitButton = driver.$("button[type='submit']");
this.registerButton = driver.$("a[href='/register']");
this.errorContainer = driver.$(".form__error");
}

public LoginPage() {
this.usernameInput = Selenide.$("input[name='username']");
this.passwordInput = Selenide.$("input[name='password']");
this.submitButton = Selenide.$("button[type='submit']");
this.registerButton = Selenide.$("a[href='/register']");
this.errorContainer = Selenide.$(".form__error");
}

@Nonnull
public RegisterPage doRegister() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
package guru.qa.niffler.test.web;

import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideDriver;
import guru.qa.niffler.jupiter.annotation.User;
import guru.qa.niffler.jupiter.annotation.meta.WebTest;
import guru.qa.niffler.model.rest.UserJson;
import guru.qa.niffler.page.FriendsPage;
import guru.qa.niffler.page.LoginPage;
import guru.qa.niffler.page.MainPage;
import guru.qa.niffler.page.PeoplePage;
import guru.qa.niffler.utils.SelenideUtils;
import org.junit.jupiter.api.Test;

import static com.codeborne.selenide.Selenide.open;

@WebTest
public class FriendsWebTest {

private final SelenideDriver driver = new SelenideDriver(SelenideUtils.chromeConfig);

@User(friends = 1)
@Test
void friendShouldBePresentInFriendsTable(UserJson user) {
final String friendUsername = user.testData().friendsUsernames()[0];

Selenide.open(LoginPage.URL, LoginPage.class)
driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
Expand All @@ -31,7 +33,7 @@ void friendShouldBePresentInFriendsTable(UserJson user) {
@User
@Test
void friendsTableShouldBeEmptyForNewUser(UserJson user) {
Selenide.open(LoginPage.URL, LoginPage.class)
driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
Expand All @@ -44,7 +46,7 @@ void friendsTableShouldBeEmptyForNewUser(UserJson user) {
void incomeInvitationBePresentInFriendsTable(UserJson user) {
final String incomeInvitationUsername = user.testData().incomeInvitationsUsernames()[0];

Selenide.open(LoginPage.URL, LoginPage.class)
driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
Expand All @@ -57,7 +59,7 @@ void incomeInvitationBePresentInFriendsTable(UserJson user) {
void outcomeInvitationBePresentInAllPeoplesTable(UserJson user) {
final String outcomeInvitationUsername = user.testData().outcomeInvitationsUsernames()[0];

Selenide.open(LoginPage.URL, LoginPage.class)
driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
Expand All @@ -70,7 +72,7 @@ void outcomeInvitationBePresentInAllPeoplesTable(UserJson user) {
void shouldRemoveFriend(UserJson user) {
final String userToRemove = user.testData().friendsUsernames()[0];

Selenide.open(LoginPage.URL, LoginPage.class)
driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
Expand All @@ -84,15 +86,15 @@ void shouldRemoveFriend(UserJson user) {
void shouldAcceptInvitation(UserJson user) {
final String userToAccept = user.testData().incomeInvitationsUsernames()[0];

FriendsPage friendsPage = open(LoginPage.URL, LoginPage.class)
FriendsPage friendsPage = driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
.toFriendsPage()
.checkExistingInvitationsCount(1)
.acceptFriendInvitationFromUser(userToAccept);

Selenide.refresh();
driver.refresh();

friendsPage.checkExistingInvitationsCount(0)
.checkExistingFriendsCount(1)
Expand All @@ -104,20 +106,20 @@ void shouldAcceptInvitation(UserJson user) {
void shouldDeclineInvitation(UserJson user) {
final String userToDecline = user.testData().incomeInvitationsUsernames()[0];

FriendsPage friendsPage = Selenide.open(LoginPage.URL, LoginPage.class)
FriendsPage friendsPage = driver.open(LoginPage.URL, LoginPage.class)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.getHeader()
.toFriendsPage()
.checkExistingInvitationsCount(1)
.declineFriendInvitationFromUser(userToDecline);

Selenide.refresh();
driver.refresh();

friendsPage.checkExistingInvitationsCount(0)
.checkExistingFriendsCount(0);

open(PeoplePage.URL, PeoplePage.class)
driver.open(PeoplePage.URL, PeoplePage.class)
.checkExistingUser(userToDecline);
}
}
Original file line number Diff line number Diff line change
@@ -1,32 +1,53 @@
package guru.qa.niffler.test.web;

import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.SelenideConfig;
import com.codeborne.selenide.SelenideDriver;
import guru.qa.niffler.jupiter.annotation.User;
import guru.qa.niffler.jupiter.annotation.meta.WebTest;
import guru.qa.niffler.jupiter.extension.BrowserExtension;
import guru.qa.niffler.model.rest.UserJson;
import guru.qa.niffler.page.LoginPage;
import guru.qa.niffler.page.MainPage;
import guru.qa.niffler.utils.SelenideUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.util.List;

import static guru.qa.niffler.utils.RandomDataUtils.randomUsername;

@WebTest
public class LoginTest {

@RegisterExtension
private final BrowserExtension browserExtension = new BrowserExtension();
private final SelenideDriver driver = new SelenideDriver(SelenideUtils.chromeConfig);

@User
@Test
void mainPageShouldBeDisplayedAfterSuccessLogin(UserJson user) {
Selenide.open(LoginPage.URL, LoginPage.class)
browserExtension.drivers().add(driver);

driver.open(LoginPage.URL);
new LoginPage(driver)
.fillLoginPage(user.username(), user.testData().password())
.submit(new MainPage())
.checkThatPageLoaded();
}

@Test
void userShouldStayOnLoginPageAfterLoginWithBadCredentials() {
Selenide.open(LoginPage.URL, LoginPage.class)
SelenideDriver firefox = new SelenideDriver(SelenideUtils.firefoxConfig);

browserExtension.drivers().addAll(List.of(driver, firefox));

driver.open(LoginPage.URL);
firefox.open(LoginPage.URL);
new LoginPage(driver)
.fillLoginPage(randomUsername(), "BAD")
.submit(new LoginPage())
.checkError("Bad credentials");
.submit(new LoginPage(driver))
.checkError("Bad credentials!");

firefox.$(".logo-section__text").should(Condition.text("Niffler!"));
}
}
Loading

0 comments on commit 60873f6

Please sign in to comment.