【问题标题】:Java selenium - Second method is not included in testJava selenium - 第二种方法不包括在测试中
【发布时间】:2021-06-22 17:27:34
【问题描述】:

我是自动化测试的新手,非常感谢您的帮助。当我运行测试时,只执行第一个方法(mainPage)。如果我在第二种方法(监视器)之前添加@Test 前缀,测试将在新窗口中运行,我希望在第一种方法结束后在同一窗口中继续测试。

public class comtradeShop {

    WebDriver driver;
    String URL = "https://www.ctshop.rs/";

    @BeforeMethod
    public void init() {
        System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver_91.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(URL);
    }

    @AfterMethod
    // public void quit(){}

    @Test
    public void mainPage() throws InterruptedException {
        WebElement menu = driver.findElement(By.cssSelector(".am-opener.sharkskin-collapse"));


        Actions actions = new Actions(driver);
        actions.moveToElement(menu).build().perform();
        driver.findElement(By.cssSelector(".sharkskin-megamenu.megamenu-v.megamenu-am>li:nth-child(6)")).click();
        Thread.sleep(5000);
        WebElement popup = driver.findElement(By.cssSelector(".soundest-form-background-image-wrapper"));
        if (popup.isDisplayed()) {
            driver.findElement(By.cssSelector(".soundest-form-background-image-close-holder > a")).click();
        } else {
            System.out.println("Popup is not shown");
        }
    }
    
    public void monitors(){
        WebElement monitors = driver.findElement(By.cssSelector(".row.categories-big >div:nth-child(1)"));
        monitors.click();
    }
}

【问题讨论】:

  • ..我想在第一个方法结束后在同一个窗口中继续测试.. 那你为什么不把这两个测试合并成一个测试呢?
  • 您是否使用 xml 文件来运行套件?

标签: java selenium testng


【解决方案1】:

使用@BeforeClass 启动浏览器 使用@AfterClass退出驱动

【讨论】:

  • 非常感谢朋友
【解决方案2】:

将第二个测试标记为@Test 是有道理的,如果您认为这是一个单独的测试内容。我理解想要从第一个停止的地方开始,并且不希望任何测试变得太大。然后,您可能想探索在较早的测试失败后跳过后续测试(或如何适应不在您认为的位置)。

不过,您遇到的是 @BeforeMethod 在每次测试之前运行。这就是为什么第二个测试,当标记为测试时,会盯着一个新窗口。如果您想在开始时设置并获取该 url,请将其改为 @BeforeClass(类似地,@AfterClass 完全关闭)。

【讨论】:

    【解决方案3】:

    每个注释都有自己的含义、定义和功能。

    @BeforeMethod @BeforeMethod 注解的方法将在每个测试方法执行之前被调用。在您的情况下,它将在每个测试方法之前执行,即。 mainPage()monitors()。与其他测试将在新窗口或新会话中运行的原因相同。

    有两种解决方案或注释可以解决您的问题,通过将 @BeforeMethod 替换为它们,您可以获得所需的结果:

    @BeforeClass:@BeforeClass 注释方法在当前类中的第一个测试方法执行之前运行。

    @BeforeTest:@BeforeTest 注释下的方法将在属于该文件夹的任何测试之前首先执行。

    您也可以使用@Test注解方法的优先级来设置顺序,也可以使用@AfterMethod注解对每个失败测试用例进行截图。

    完整的修复代码:

    public class comtradeShop {
    
        WebDriver driver;
        String URL = "https://www.ctshop.rs/";
    
        @BeforeClass
        public void init() {
            System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver_91.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            driver.get(URL);
        }
    
    
    
        @Test(priority = 0)
        public void mainPage() throws InterruptedException {
            WebElement menu = driver.findElement(By.cssSelector(".am-opener.sharkskin-collapse"));
            Actions actions = new Actions(driver);
            actions.moveToElement(menu).build().perform();
            driver.findElement(By.cssSelector(".sharkskin-megamenu.megamenu-v.megamenu-am>li:nth-child(6)")).click();
            Thread.sleep(5000);
            WebElement popup = driver.findElement(By.cssSelector(".soundest-form-background-image-wrapper"));
            if (popup.isDisplayed()) {
                driver.findElement(By.cssSelector(".soundest-form-background-image-close-holder > a")).click();
            } else {
                System.out.println("Popup is not shown");
            }
        }
        @Test(priority = 1)
        public void monitors(){
            WebElement monitors = driver.findElement(By.cssSelector(".row.categories-big >div:nth-child(1)"));
            monitors.click();
        }
    
        @AfterMethod
        public void takeScreenshot(ITestResult testResult) {
            if (testResult.getStatus() == ITestResult.FAILURE){
                //TAKE SCREENSHOTT ON FAILURE
            }
        }
    
        @AfterClass
        public void quit(){
            if(driver!=null)
                driver.quit();
        }
    }
    

    【讨论】:

    • 非常感谢伙计。我真的很感谢你的努力
    • 如果您对我的回答满意,可以接受吗? :)
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多