Skip to content

Commit 87797df

Browse files
committed
Update version 1.7.0 PREVIEW
1 parent 1d3185b commit 87797df

17 files changed

Lines changed: 271 additions & 109 deletions

File tree

README.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Automation Framework Selenium Java with TestNG building by Anh Tester
1+
## Automation Framework Selenium Java with TestNG building by Anh Tester
22

33
**SOME FEATURES IN FRAMEWORK**
44

@@ -15,10 +15,10 @@
1515
11. Main Keyword: WebUI (call common function)
1616
12. Sample test function
1717

18-
## **SYSTEM REQUIREMENTS**
18+
### **SYSTEM REQUIREMENTS**
1919

2020
- **JDK All Version**
21-
- Chrome Browser, Edge Browser
21+
- Chrome Browser, Edge Browser, Firefox Browser
2222
- Setup **Allure**:
2323
https://mvnrepository.com/artifact/io.qameta.allure/allure-java-commons
2424
or
@@ -31,7 +31,7 @@
3131

3232
![image](https://user-images.githubusercontent.com/87883620/161707184-7ad558f2-0d7d-4851-bfd6-2796d4e46593.png)
3333

34-
## **HOW TO USE**
34+
### **HOW TO USE**
3535

3636
**1. Run parallel the test case**
3737

@@ -81,8 +81,6 @@
8181

8282
![image](https://user-images.githubusercontent.com/87883620/161659238-88337f69-b742-4cd7-87f2-76670519c8dd.png)
8383

84-
![image](https://user-images.githubusercontent.com/87883620/161710836-8f3eee7c-19ba-410d-8498-5f314e6289a5.png)
85-
8684
**6. Log to file**
8785

8886
- Call class: Log.info , Log.pass, Log.error,... (**Log** is a custom global class from Log4j2)
@@ -132,7 +130,7 @@
132130
+ TestSimpleCode
133131
```
134132

135-
## Project structure
133+
### Project structure
136134

137135
```
138136
📦AutomationFrameworkSelenium
@@ -251,9 +249,9 @@
251249
┗ 📜README.md
252250
```
253251

254-
## I shall write document for my Framework. Coming soon...
252+
### I shall write document for my Framework. Coming soon...
255253

256-
# Copyright 2022 Anh Tester
254+
## Copyright 2022 Anh Tester
257255

258256
> Anh Tester Blog: https://anhtester.com/
259257

pom.xml

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
<!-- Suite XML path -->
4747
<suite.signin.simple>src/test/resources/suites/SignIn-simple.xml</suite.signin.simple>
48+
<suite.signin.parallel>src/test/resources/suites/SignIn-parallel-methods.xml</suite.signin.parallel>
4849
<suite.client.parallel>src/test/resources/suites/Clients-parallel.xml</suite.client.parallel>
4950
<suite.client.simple>src/test/resources/suites/Clients-simple.xml</suite.client.simple>
5051
<suite.all>src/test/resources/suites/SuiteAll.xml</suite.all>
@@ -267,6 +268,56 @@
267268

268269
<!-- This profile execute the TestNG suite inside the suites folder on test/resources/suites -->
269270
<profiles>
271+
<profile>
272+
<id>signin-parallel</id>
273+
<build>
274+
<plugins>
275+
<plugin>
276+
<groupId>org.apache.maven.plugins</groupId>
277+
<artifactId>maven-surefire-plugin</artifactId>
278+
<version>${maven-surefire-plugin.version}</version>
279+
<configuration>
280+
<suiteXmlFiles>
281+
<suiteXmlFile>${suite.signin.parallel}</suiteXmlFile>
282+
</suiteXmlFiles>
283+
<argLine>
284+
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectjweaver.version}/aspectjweaver-${aspectjweaver.version}.jar"
285+
</argLine>
286+
<testFailureIgnore>true</testFailureIgnore>
287+
<systemPropertyVariables>
288+
<allure.results.directory>target/allure-results</allure.results.directory>
289+
</systemPropertyVariables>
290+
</configuration>
291+
</plugin>
292+
</plugins>
293+
</build>
294+
</profile>
295+
296+
<profile>
297+
<id>signin-simple</id>
298+
<build>
299+
<plugins>
300+
<plugin>
301+
<groupId>org.apache.maven.plugins</groupId>
302+
<artifactId>maven-surefire-plugin</artifactId>
303+
<version>${maven-surefire-plugin.version}</version>
304+
<configuration>
305+
<suiteXmlFiles>
306+
<suiteXmlFile>${suite.signin.simple}</suiteXmlFile>
307+
</suiteXmlFiles>
308+
<argLine>
309+
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectjweaver.version}/aspectjweaver-${aspectjweaver.version}.jar"
310+
</argLine>
311+
<testFailureIgnore>true</testFailureIgnore>
312+
<systemPropertyVariables>
313+
<allure.results.directory>target/allure-results</allure.results.directory>
314+
</systemPropertyVariables>
315+
</configuration>
316+
</plugin>
317+
</plugins>
318+
</build>
319+
</profile>
320+
270321
<profile>
271322
<id>clients-parallel</id>
272323
<build>
@@ -318,7 +369,7 @@
318369
</profile>
319370

320371
<profile>
321-
<id>Suite-All</id>
372+
<id>suite-all</id>
322373
<build>
323374
<plugins>
324375
<plugin>

src/main/java/anhtester/com/utils/WebUI.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,18 @@ public static boolean verifyElementNotPresent(By by, int timeout, String message
924924
}
925925
}
926926

927+
public static boolean checkElementVisible(By by, long timeout) {
928+
smartWait();
929+
930+
try {
931+
WebDriverWait wait = new WebDriverWait(DriverManager.getDriver(), Duration.ofSeconds(timeout));
932+
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
933+
return true;
934+
} catch (Exception e) {
935+
return false;
936+
}
937+
}
938+
927939
public static boolean verifyElementVisible(By by) {
928940
smartWait();
929941

@@ -1624,7 +1636,7 @@ public static WebElement waitForElementVisible(By by) {
16241636

16251637
try {
16261638
WebDriverWait wait = new WebDriverWait(DriverManager.getDriver(), Duration.ofSeconds(WAIT_EXPLICIT), Duration.ofMillis(500));
1627-
boolean check = verifyElementVisible(by);
1639+
boolean check = checkElementVisible(by, 1);
16281640
if (check == true) {
16291641
return wait.until(ExpectedConditions.visibilityOfElementLocated(by));
16301642
} else {
@@ -1694,6 +1706,7 @@ public static WebElement waitForElementPresent(By by, long timeOut) {
16941706
Assert.fail("Timeout waiting for the element to exist. " + by.toString());
16951707
Log.error("Timeout waiting for the element to exist. " + by.toString());
16961708
}
1709+
16971710
return null;
16981711
}
16991712

src/test/java/anhtester/com/common/BaseTest.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,15 @@
44
import anhtester.com.driver.TargetFactory;
55
import anhtester.com.helpers.PropertiesHelpers;
66
import anhtester.com.listeners.TestListener;
7+
import anhtester.com.projects.website.crm.pages.CommonPage;
78
import org.openqa.selenium.WebDriver;
89
import org.openqa.selenium.support.ThreadGuard;
910
import org.testng.annotations.*;
1011

1112
import java.lang.reflect.Method;
1213

1314
@Listeners({TestListener.class})
14-
public class BaseTest {
15-
16-
@BeforeSuite
17-
public void beforeSuite() {
18-
19-
}
15+
public class BaseTest extends CommonPage{
2016

2117
@Parameters("BROWSER")
2218
@BeforeMethod(alwaysRun = true)

src/test/java/anhtester/com/projects/website/crm/pages/Clients/ClientPage.java

Lines changed: 67 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,82 +2,110 @@
22

33
import anhtester.com.enums.FailureHandling;
44
import anhtester.com.projects.website.crm.models.ClientModel;
5-
import anhtester.com.utils.ObjectUtils;
5+
import anhtester.com.projects.website.crm.pages.CommonPage;
66
import anhtester.com.utils.WebUI;
7+
import org.openqa.selenium.By;
78

89
import java.util.Hashtable;
910

10-
public class ClientPage {
11+
public class ClientPage extends CommonPage {
1112

1213
public ClientPage() {
14+
1315
}
1416

1517
public String pageText = "Total clients";
1618
public String pageUrl = "/clients";
1719

20+
public By buttonAddClient = By.xpath("//a[normalize-space()='Add client']");
21+
public By inputCompanyName = By.xpath("//input[@id='company_name']");
22+
public By selectOwner = By.xpath("//div[@id='s2id_created_by']");
23+
public By inputSearchOwner = By.xpath("//div[@id='select2-drop']//input");
24+
public By selectFirstItemOwner = By.xpath("(//div[contains(@id,'select2-result-label')])[1]");
25+
public By inputAddress = By.xpath("//textarea[@id='address']");
26+
public By inputCity = By.xpath("//input[@id='city']");
27+
public By inputState = By.xpath("//input[@id='state']");
28+
public By inputZip = By.xpath("//input[@id='zip']");
29+
public By inputCountry = By.xpath("//input[@id='country']");
30+
public By inputPhone = By.xpath("//input[@id='phone']");
31+
public By inputWebsite = By.xpath("//input[@id='website']");
32+
public By inputVat = By.xpath("//input[@id='vat_number']");
33+
public By inputClientGroups = By.xpath("(//label[normalize-space()='Client groups']/following-sibling::div//input)[1]");
34+
public By spanFirstItemClientGroups = By.xpath("//span[@class='select2-match']");
35+
public By buttonSaveOnDialog = By.xpath("//div[@id='ajaxModalContent']//button[normalize-space()='Save']");
36+
public By inputSearch = By.xpath("//input[@placeholder='Search']");
37+
public By itemClientFirstRow = By.xpath("//table[@id='client-table']//tbody/tr[1]/td[2]/a");
38+
public By tabClientInfo = By.xpath("//a[normalize-space()='Client info']");
39+
public By ownerDetail = By.xpath("//div[@id='s2id_created_by']//a[@class='select2-choice']/span[1]");
40+
public By radioOrganization = By.xpath("//input[@id='type_organization']");
41+
public By labelOnClientPage = By.xpath("//span[normalize-space()='Total clients']");
42+
public By tabClient = By.xpath("//ul[@id='client-tabs']//li[2]");
43+
public By labelClientGroups = By.xpath("//li[@class='select2-search-choice']/div");
44+
45+
1846
public void openClientTabPage() {
1947
//Muốn chạy tiếp thì chọn FailureHandling.CONTINUE_ON_FAILURE
20-
WebUI.verifyElementTextEquals(ObjectUtils.getObject("labelOnClientPage"), pageText, FailureHandling.CONTINUE_ON_FAILURE);
48+
WebUI.verifyElementTextEquals(labelOnClientPage, pageText, FailureHandling.CONTINUE_ON_FAILURE);
2149
WebUI.sleep(1);
22-
WebUI.clickElement(ObjectUtils.getObject("tabClient"));
50+
WebUI.clickElement(tabClient);
2351
WebUI.waitForPageLoaded();
2452
WebUI.waitForJQueryLoad();
2553
}
2654

2755
public void addClient(Hashtable<String, String> data) {
28-
WebUI.clickElement(ObjectUtils.getObject("buttonAddClient"));
29-
WebUI.setText(ObjectUtils.getObject("inputCompanyName"), data.get(ClientModel.getCompanyName()));
30-
WebUI.clickElement(ObjectUtils.getObject("selectOwner"));
31-
WebUI.setText(ObjectUtils.getObject("inputSearchOwner"), data.get(ClientModel.getOwner()));
32-
WebUI.clickElement(ObjectUtils.getObject("selectFirstItemOwner"));
33-
WebUI.setText(ObjectUtils.getObject("inputAddress"), data.get(ClientModel.getAddress()));
34-
WebUI.setText(ObjectUtils.getObject("inputCity"), data.get(ClientModel.getCity()));
35-
WebUI.setText(ObjectUtils.getObject("inputState"), data.get(ClientModel.getState()));
36-
WebUI.setText(ObjectUtils.getObject("inputZip"), data.get(ClientModel.getZip()));
37-
WebUI.setText(ObjectUtils.getObject("inputCountry"), data.get(ClientModel.getCountry()));
38-
WebUI.setText(ObjectUtils.getObject("inputPhone"), data.get(ClientModel.getPhone()));
39-
WebUI.setText(ObjectUtils.getObject("inputWebsite"), data.get(ClientModel.getWebsite()));
40-
WebUI.setText(ObjectUtils.getObject("inputVat"), data.get(ClientModel.getVat()));
41-
WebUI.setText(ObjectUtils.getObject("inputClientGroups"), data.get(ClientModel.getClientGroup()));
42-
WebUI.clickElement(ObjectUtils.getObject("spanFirstItemClientGroups"));
43-
WebUI.clickElement(ObjectUtils.getObject("buttonSaveOnDialog"));
44-
45-
WebUI.setText(ObjectUtils.getObject("inputSearch"), data.get(ClientModel.getCompanyName()));
56+
WebUI.clickElement(buttonAddClient);
57+
WebUI.setText(inputCompanyName, data.get(ClientModel.getCompanyName()));
58+
WebUI.clickElement(selectOwner);
59+
WebUI.setText(inputSearchOwner, data.get(ClientModel.getOwner()));
60+
WebUI.clickElement(selectFirstItemOwner);
61+
WebUI.setText(inputAddress, data.get(ClientModel.getAddress()));
62+
WebUI.setText(inputCity, data.get(ClientModel.getCity()));
63+
WebUI.setText(inputState, data.get(ClientModel.getState()));
64+
WebUI.setText(inputZip, data.get(ClientModel.getZip()));
65+
WebUI.setText(inputCountry, data.get(ClientModel.getCountry()));
66+
WebUI.setText(inputPhone, data.get(ClientModel.getPhone()));
67+
WebUI.setText(inputWebsite, data.get(ClientModel.getWebsite()));
68+
WebUI.setText(inputVat, data.get(ClientModel.getVat()));
69+
WebUI.setText(inputClientGroups, data.get(ClientModel.getClientGroup()));
70+
WebUI.clickElement(spanFirstItemClientGroups);
71+
WebUI.clickElement(buttonSaveOnDialog);
72+
WebUI.waitForPageLoaded();
73+
WebUI.setText(inputSearch, data.get(ClientModel.getCompanyName()));
4674
WebUI.waitForPageLoaded();
4775
WebUI.sleep(3);
4876
WebUI.checkContainsSearchTableByColumn(2, data.get(ClientModel.getCompanyName()));
4977
checkClientDetail(data);
5078
}
5179

5280
public void checkClientDetail(Hashtable<String, String> data) {
53-
WebUI.clickElement(ObjectUtils.getObject("itemClientFirstRow"));
81+
WebUI.clickElement(itemClientFirstRow);
5482
WebUI.waitForPageLoaded();
5583
WebUI.waitForJQueryLoad();
5684
WebUI.sleep(1);
57-
WebUI.clickElement(ObjectUtils.getObject("tabClientInfo"));
85+
WebUI.clickElement(tabClientInfo);
5886
WebUI.waitForPageLoaded();
5987
WebUI.waitForJQueryLoad();
6088
WebUI.sleep(1);
61-
WebUI.verifyElementChecked(ObjectUtils.getObject("radioOrganization"), "Type off Client is not Organization");
62-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputCompanyName"), "value", data.get(ClientModel.getCompanyName()));
63-
WebUI.verifyElementTextEquals(ObjectUtils.getObject("ownerDetail"), data.get(ClientModel.getOwner()), FailureHandling.CONTINUE_ON_FAILURE);
64-
WebUI.verifyElementTextEquals(ObjectUtils.getObject("inputAddress"), data.get(ClientModel.getAddress()), FailureHandling.CONTINUE_ON_FAILURE);
65-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputCity"), "value", data.get(ClientModel.getCity()));
66-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputState"), "value", data.get(ClientModel.getState()));
67-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputZip"), "value", data.get(ClientModel.getZip()));
68-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputCountry"), "value", data.get(ClientModel.getCountry()));
69-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputPhone"), "value", data.get(ClientModel.getPhone()));
70-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputWebsite"), "value", data.get(ClientModel.getWebsite()));
71-
WebUI.verifyElementAttributeValue(ObjectUtils.getObject("inputVat"), "value", data.get(ClientModel.getVat()));
72-
WebUI.verifyElementTextEquals(ObjectUtils.getObject("labelClientGroups"), data.get(ClientModel.getClientGroup()), FailureHandling.CONTINUE_ON_FAILURE);
89+
WebUI.verifyElementChecked(radioOrganization, "Type off Client is not Organization");
90+
WebUI.verifyElementAttributeValue(inputCompanyName, "value", data.get(ClientModel.getCompanyName()));
91+
WebUI.verifyElementTextEquals(ownerDetail, data.get(ClientModel.getOwner()), FailureHandling.CONTINUE_ON_FAILURE);
92+
WebUI.verifyElementTextEquals(inputAddress, data.get(ClientModel.getAddress()), FailureHandling.CONTINUE_ON_FAILURE);
93+
WebUI.verifyElementAttributeValue(inputCity, "value", data.get(ClientModel.getCity()));
94+
WebUI.verifyElementAttributeValue(inputState, "value", data.get(ClientModel.getState()));
95+
WebUI.verifyElementAttributeValue(inputZip, "value", data.get(ClientModel.getZip()));
96+
WebUI.verifyElementAttributeValue(inputCountry, "value", data.get(ClientModel.getCountry()));
97+
WebUI.verifyElementAttributeValue(inputPhone, "value", data.get(ClientModel.getPhone()));
98+
WebUI.verifyElementAttributeValue(inputWebsite, "value", data.get(ClientModel.getWebsite()));
99+
WebUI.verifyElementAttributeValue(inputVat, "value", data.get(ClientModel.getVat()));
100+
WebUI.verifyElementTextEquals(labelClientGroups, data.get(ClientModel.getClientGroup()), FailureHandling.CONTINUE_ON_FAILURE);
73101

74102
}
75103

76104
public void enterDataSearchClient(String value) {
77105
WebUI.sleep(2);
78-
WebUI.moveToElement(ObjectUtils.getObject("inputSearch"));
79-
WebUI.clearText(ObjectUtils.getObject("inputSearch"));
80-
WebUI.setText(ObjectUtils.getObject("inputSearch"), value);
106+
WebUI.moveToElement(inputSearch);
107+
WebUI.clearText(inputSearch);
108+
WebUI.setText(inputSearch, value);
81109
WebUI.waitForPageLoaded();
82110
WebUI.sleep(2);
83111
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package anhtester.com.projects.website.crm.pages;
2+
3+
import anhtester.com.projects.website.crm.pages.Clients.ClientPage;
4+
import anhtester.com.projects.website.crm.pages.Dashboard.DashboardPage;
5+
import anhtester.com.projects.website.crm.pages.Projects.ProjectPage;
6+
import anhtester.com.projects.website.crm.pages.SignIn.SignInPage;
7+
import anhtester.com.utils.WebUI;
8+
import org.openqa.selenium.By;
9+
10+
public class CommonPage {
11+
12+
public SignInPage signInPage;
13+
public DashboardPage dashboardPage;
14+
public ClientPage clientPage;
15+
public ProjectPage projectPage;
16+
17+
public By dropdownAccount = By.xpath("//a[@id='user-dropdown']//span[2]");
18+
public By buttonSignOut = By.xpath("//a[normalize-space()='Sign Out']");
19+
20+
21+
public SignInPage signOut() {
22+
WebUI.clickElement(dropdownAccount);
23+
WebUI.clickElement(buttonSignOut);
24+
return new SignInPage();
25+
}
26+
27+
public SignInPage getSignInPage() {
28+
if (signInPage == null) {
29+
signInPage = new SignInPage();
30+
}
31+
return signInPage;
32+
}
33+
34+
public DashboardPage getDashboardPage() {
35+
if (dashboardPage == null) {
36+
dashboardPage = new DashboardPage();
37+
}
38+
return dashboardPage;
39+
}
40+
41+
public ClientPage getClientPage() {
42+
if (clientPage == null) {
43+
clientPage = new ClientPage();
44+
}
45+
return clientPage;
46+
}
47+
48+
public ProjectPage getProjectPage() {
49+
if (projectPage == null) {
50+
projectPage = new ProjectPage();
51+
}
52+
return projectPage;
53+
}
54+
55+
}

0 commit comments

Comments
 (0)