#java #selenium #selenium-webdriver #intellij-idea #testng
Вопрос:
Я использую объектную модель TestNG и Page. Я создал несколько тестовых примеров. Я вижу, что первые два тестовых случая работают. Но третий тестовый случай начинается на новой странице, которая открывается вторым тестовым случаем. Я не могу взаимодействовать с новой страницей и получаю ошибку исключения нулевого указателя. Не знаю, что пошло не так.
У меня здесь три класса Java.
Это мой базовый класс:
package MYQC_Reusable_Classes;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
public class MYQC_Base_Class {
public static WebDriver driver = null;
// public static ExtentTest Logger = null;
// public static ExtentReports report = null;
@BeforeSuite
public void initialize() throws IOException {
// report = new ExtentReports("C:\Users\fhasan\Desktop\ExtentReport" ".html");
System.setProperty("webdriver.chrome.driver", "C:\Users\fhasan\Desktop\driver\chromedriver.exe");
ChromeOptions options = new ChromeOptions();`enter code here`
// add the precondition arguments
options.addArguments("start-maximized", "incognito");
driver = new ChromeDriver(options);
// To maximize browser
driver.manage().window().maximize();
// Implicit wait
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@BeforeMethod
public void timer(){
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@AfterSuite
// Test cleanup
public void TeardownTest() throws InterruptedException {
Thread.sleep(4000);
MYQC_Base_Class.driver.quit();
}
}
Это мой класс страницы:
package MYQC_Browser_Pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
public class MYQC_Login_Page {
WebDriver driver;
// constructor that will be automatically called as soon as the object of the
// class is created
public MYQC_Login_Page(WebDriver driver) {
this.driver = driver;
}
@FindBy(how = How.ID, using = "loginName")
public static WebElement userNameField;
@FindBy(how = How.ID, using = "loginPassword")
public static WebElement passwordField;
@FindBy(how = How.ID, using = "loginButton")
public static WebElement clickLogin;
//Method to enter username
public void clickUserName() {
userNameField.click();
}
public void enterUserName(String user) {
userNameField.sendKeys(user);
}
public void clickPass() {
passwordField.click();
}
public void enterPassword(String pass) {
passwordField.sendKeys(pass);
}
//Method to click on Login button
public void clickLoginButton() {
clickLogin.click();
}
}
This is my first test case which works fine:
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.util.PriorityQueue;
public class TC001_MYQC_Login_Selection_Button_Text extends MYQC_Base_Class {
@Test()
public void MYQC_Login_Button_Text() throws InterruptedException, IOException {
//creating anb object of the CUST4_MYQC_Login_Selection_Page
CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);
// going to the cust4 myqc link
driver.get("https://mmhcustfour.com");
Thread.sleep(3000);
Assert.assertEquals(go_To_MYQC_Page.buttonText(), "Login with Quickcharge Authentication");
//System.out.print( go_To_MYQC_Page.buttonText());
}
}
This is my second test case (on the same page) which also works fine:
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.CUST4_MYQC_Login_Selection_Page;
import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
public class TC002_MYQC_Login_Selection_Test extends MYQC_Base_Class {
@Test
public void Go_To_MYQC_Login_Page_Test() throws InterruptedException, IOException {
//creating anb object of the CUST4_MYQC_Login_Selection_Page
CUST4_MYQC_Login_Selection_Page go_To_MYQC_Page = PageFactory.initElements(driver, CUST4_MYQC_Login_Selection_Page.class);
//Clicking on the button to go to the MYQC login page
go_To_MYQC_Page.preClickLogin();
// waiting few seconds to get a screenshot of the page
Thread.sleep(2000);
File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src, new File("C:\Users\fhasan\Desktop\Selenium Screenshots\MYQCLogin_Page.png"));
Thread.sleep(2000);
}
}
This is my third test case class: (which creates the error)
package MYQC_TestCase_Classes;
import MYQC_Browser_Pages.MYQC_Login_Page;
import MYQC_Reusable_Classes.MYQC_Base_Class;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TC003_MYQC_Prepaid_Login_Test extends MYQC_Base_Class {
//creating an object of the page
MYQC_Login_Page login_page = PageFactory.initElements(driver,MYQC_Login_Page.class);
@Test
public void MYQC_Login() throws InterruptedException {
Thread.sleep(2000);
login_page.clickUserName();
login_page.enterUserName("***");
Thread.sleep(2000);
login_page.clickPass();
login_page.enterPassword("***");
login_page.clickLoginButton();
}
}
После запуска кода я получаю следующую ошибку:
java.lang.NullPointerException
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.$Proxy9.click(Unknown Source)
at MYQC_Browser_Pages.MYQC_Login_Page.clickUserName(MYQC_Login_Page.java:30)
at MYQC_TestCase_Classes.TC003_MYQC_Prepaid_Login_Test.MYQC_Login(TC003_MYQC_Prepaid_Login_Test.java:20)
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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
Комментарии:
1. Вы все отладили ? Похоже, драйвер не инициализирован, и вы передаете значение null
2. Спасибо вам за ваш ответ. Я инициализировал драйвер @BeforeSuite, и он отлично работает в первых двух тестовых случаях. Мне интересно, нужно ли мне что-нибудь сделать, прежде чем работать над текущим тестовым примером.
3. Где вы запускаете страницу? драйвер.получить(url)?
4. Почему ваши поля объектов страницы статичны?
5. @NandanA Стартовая страница была создана в предыдущем тестовом примере, который работает нормально. @Test() public void MYQC_Login_Button_Text() вызывает исключение прерывания, исключение ввода-вывода { //создание объекта страницы CUST4_MYQC_Login_Selection_Page Страница CUST4_MYQC_Login_Selection_Page Страница go_To_MYQC_Page = PageFactory.initElements(драйвер, CUST4_MYQC_Login_Selection_Page.class); // переходим по ссылке driver.get(» mmhasan345.com» );
Ответ №1:
ваш элемент имени пользователя не найден в вашем 3-м тесте, пожалуйста, выполните следующие действия
на страницах MYQC_Browser_Pages.MYQC_Login_Page.Имя пользователя(MYQC_Login_Page.java:30)
- Пожалуйста, добавьте скриншот непосредственно перед вводом имени пользователя,
- Добавьте время ожидания, чтобы полностью загрузить веб-сайт.
все равно бесполезно, лучше вам изолировать все ваши методы тестирования.
- отсутствие статических свойств
- вход и выход из системы должны быть выполнены до метода и после метода — метод тестирования должен быть независимым
- используйте общий метод для утверждений, поэтому всякий раз, когда получить не удалось, автоматически добавляйте скриншот
Комментарии:
1. Спасибо. Я пытался это сделать. Все та же проблема.