【问题标题】:How to use the same browser window in multiple classes using TestNG Selenium webdriver in java?java - 如何在java中使用TestNG Selenium webdriver在多个类中使用相同的浏览器窗口?
【发布时间】:2018-08-18 00:45:14
【问题描述】:

我正在尝试自动化具有登录和登录后有许多菜单项的网页。我想以这样的方式自动化它,它只登录到网页一次,然后使用不同的菜单项。每个新的菜单项自动化都是在不同的类中创建的。

package pack1;

public class Init {

    public WebDriver driver;

    ChromeOptions options;

    @BeforeSuite
    public void beforeSuite() throws AWTException, InterruptedException, IOException {
        //Setting Chrome Driver and disabling the save password option
        System.setProperty(“webdriver.chrome.driver”,”C:\\Users\\user\\Desktop\\Demo\\chromedriver.exe”);
        options = new ChromeOptions();
        Map<String, Object> prefs = new HashMap<String, Object>();
        prefs.put(“credentials_enable_service”, false);
        prefs.put(“profile.password_manager_enabled”, false);
        options.setExperimentalOption(“prefs”, prefs);
        driver=new ChromeDriver(options);

        //Opening the URL
        driver.get(“myURL”);
        driver.manage().window().maximize();

        //Login to the portal
        driver.findElement(By.xpath(“.//*[@id=’content-wrapper’]/div/div/div/div/div/div/div/form/div/div[1]/input”)).sendKeys(username);
        driver.findElement(By.xpath(“.//*[@id=’content-wrapper’]/div/div/div/div/div/div/div/form/div/div[2]/input”)).sendKeys(password);
        driver.findElement(By.xpath(“.//*[@id=’content-wrapper’]/div/div/div/div/div/div/div/form/div/div[3]/button”)).click();

    }

    @AfterSuite
    public void afterSuite() {
        //Closing the driver
        // driver.close();
    }
}

A类

    package pack1;

public class ClassA extends Init{

    @Test (priority=0, enabled = true)
    public void Setup() throws InterruptedException{
        //Traversing the menu to reach contract grower setup
        Thread.sleep(5000);
        driver.findElement(By.linkText(“Menu1”)).click();
        driver.findElement(By.linkText(“SubMenu1”)).click();

    }

}

B类

    package pack1;

public class ClassBextends Init{

    @Test (priority=0, enabled = true)
    public void Setup() throws InterruptedException{
        //Traversing the menu to reach contract grower setup
        Thread.sleep(5000);
        driver.findElement(By.linkText(“Menu2”)).click();
        driver.findElement(By.linkText(“SubMenu2”)).click();
    }

}

testing.xml

 <?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd”>
<suite name=”Suite”>
    <test name=”Test”>
        <classes>
            <class name=”pack1.ClassA”/>
            <class name=”pack1.ClassB”/>
            <class name=”pack1.Init”/>
        </classes>
    </test> <!– Test –>
</suite> <!– Suite –>

【问题讨论】:

    标签: java selenium selenium-webdriver testng selenium-chromedriver


    【解决方案1】:

    您应该进行以下更改:

    • Init 类中的WebDriver 配置为static
    • 不要在测试类中继承 Init
    • 要在测试类中使用driver,请以Init.getDriver(); 访问它

    基类

    public class Init {
    
        private static WebDriver driver;
    
        public static WebDriver getDriver() {
            return driver;
        }
    
        @BeforeSuite
        public void beforeSuite() {
            System.out.println("BS");
            System.setProperty("webdriver.chrome.driver", "");
            driver = new ChromeDriver();
            driver.get("https://www.google.com");
        }
    
        @AfterSuite
        public void afterSuite() {
            System.out.println("AS");
            driver.quit();
        }
    }
    

    A 类

    public class ClassA {
        @Test(priority = 0, enabled = true)
        public void classATest() throws InterruptedException {
            System.out.println("classATest");
            Init.getDriver().findElement(By.name("q")).sendKeys("Class 1");
        }
    }
    

    B 类

    public class ClassB {
        @Test(priority = 0, enabled = true)
        public void class2Test() throws InterruptedException {
            System.out.println("classBTest");
            Init.getDriver().findElement(By.name("q")).sendKeys("Class 2");
        }
    }
    

    TestNG XML 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="System Testing" parallel="none" thread-count="1">
        <test name="MenuTest" verbose="0">
            <classes>
                <class name="com.pack1.ClassA" />
                <class name="com.pack1.ClassB" />
                <class name="com.pack1.Init" />
            </classes>
        </test>
    </suite> 
    

    输出

    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running TestSuite
    BS
    Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 16311
    Only local connections are allowed.
    Mar 09, 2018 2:33:59 PM org.openqa.selenium.remote.ProtocolHandshake.createSession
    INFO: Detected dialect: OSS
    classATest
    classBTest
    AS
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.541 sec - in TestSuite
    

    【讨论】:

    • 谢谢,伙计!现在很有意义。
    • @Sighil 如果我想使用驱动程序对象而不是 Init.getDriver() 怎么办?
    • @Ghana Init.getDriver() 只是一个 getter 方法。您可以公开 Init.driver 并在任何其他类中作为 Init.driver 访问它。
    • 如果驱动程序必须被制作成非静态的,那将需要大量的重组
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-10-07
    • 1970-01-01
    • 2019-03-30
    • 2015-12-30
    • 2011-12-11
    相关资源
    最近更新 更多