【问题标题】:How to overcome the issue of code block similarity with "visibilityOfElementLocated"?如何克服与“visibilityOfElementLocated”代码块相似的问题?
【发布时间】:2018-05-30 07:26:57
【问题描述】:
public class TestingLogin {

    WebDriver driver;
    @BeforeTest
    public void setup()
    {
        System.setProperty("webdriver.gecko.driver", "\\GeckoDriver\\geckodriver.exe");
        driver=new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("https://test.admin.placer.life/login");
    }

    @Test(priority=9)
    public void reset_null_email()
    {
        LoginPage login=new LoginPage(driver);
        driver.findElement(By.xpath("//*[@id='app']/div/div[2]/a")).click();
        WebDriverWait wait = new WebDriverWait(driver, 60);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='app']/div/div[2]/p[contains(text(),'Reset Password')]")));
        login.set_reset_email("");
        login.click_reset_button(); 
        WebDriverWait wait_reset_psw = new WebDriverWait(driver, 10);
        wait_reset_psw.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='app']/div/div[2]/form/div[2]/span[2]")));
        Assert.assertEquals(driver.findElement(By.xpath("//*[@id='app']/div/div[2]/form/div[2]/span[2]")).getText(),"The email field is required.");
        driver.navigate().refresh();
    }

    @Test(priority=10)
    public void reset_invalid_email()
    {
        LoginPage login=new LoginPage(driver);
        driver.findElement(By.xpath("//*[@id='app']/div/div[2]/a")).click();
        WebDriverWait wait = new WebDriverWait(driver, 120);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='app']/div/div[2]/p[contains(text(),'Reset Password')]")));
        login.set_reset_email("a@gmail.com");
        login.click_reset_button(); 
        WebDriverWait wait_reset_psw = new WebDriverWait(driver, 10);
        wait_reset_psw.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='app']/div/div[2]/form/div[2]/span[2]")));
        Assert.assertEquals(driver.findElement(By.xpath("//*[@id='app']/div/div[2]/form/div[2]/span[2]")).getText(),"The email field is required.");
        driver.navigate().refresh();
    }       
    @AfterTest
    public void close()
    {
        driver.close();
    }

}

大家好, 我用“visibilityOfElementLocated”尝试了reset_invalid_email(),但由于代码块的相似性,我猜这是导致测试用例失败的原因。所以我用“elementToBeClickable”尝试过>"。但是也导致了同样的错误。

请帮忙

提前致谢

【问题讨论】:

  • 您在哪一步遇到了错误?
  • 登录页面后出现错误
  • 提供 Html 和错误堆栈跟踪。
  • 通过:reset_null_email 失败:reset_invalid_email
  • org.openqa.selenium.TimeoutException:预期条件失败:等待元素可点击:By.xpath://*[@id='app']/div/div[2]/ p[contains(text(),'Reset Password')](以 500 MILLISECONDS 间隔尝试 120 秒)

标签: java selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

根据您提到的reset_invalid_email() 方法的问题,您可以使用以下解决方案:

几句话:

  • 当您打算点击某个元素时,请使用elementToBeClickable() 方法。
  • Firefox 浏览器以最大化模式打开,因此您无需使用driver.manage().window().maximize();
  • 如果您需要最大化任何浏览器,请改用 *Options 类。
  • 始终在 tearDown(){} 方法中调用 driver.quit() 以优雅地关闭和销毁 WebDriverWeb Client 实例。
  • 你的工作代码块:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.Test;
    
    public class q50598754 {
    
        WebDriver driver;
        @BeforeTest
        public void setup()
        {
            System.setProperty("webdriver.gecko.driver", "C:\\path\\to\\geckodriver.exe");
            driver=new FirefoxDriver();
            driver.get("https://test.admin.placer.life/login");
        }
    
        @Test(priority=10)
        public void reset_invalid_email()
        {
            //LoginPage login=new LoginPage(driver);
            new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("I forgot my password"))).click();
            new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='app']/div/div[2]/p[contains(text(),'Reset Password')]")));
            //login.set_reset_email("a@gmail.com");
            //skipped to reproduce the error message The email field is required
            //login.click_reset_button(); 
            driver.findElement(By.cssSelector("button.btn.btn-primary.btn-block.btn-flat")).click();;
            Assert.assertEquals(driver.findElement(By.cssSelector("div.form-group.has-feedback.has-error span.help-block")).getText(),"The email field is required.");
        } 
    
        @AfterTest
        public void close()
        {
            driver.quit();
        }
    }
    
  • 控制台输出:

    PASSED: reset_invalid_email
    
    ===============================================
        Default test
        Tests run: 1, Failures: 0, Skips: 0
    ===============================================
    
    
    ===============================================
    Default suite
    Total tests run: 1, Failures: 0, Skips: 0
    ===============================================
    

【讨论】:

  • 仅在代码中使用此方法时效果很好。您是否同时尝试了两种方法?这不适用于另一种方法,这就是问题
  • @user3806999 此答案是根据您关于I have tried the reset_invalid_email() ... but it is cause to fail 的问题构建的,因此它不适用于使用另一种方法,因为工作流程不同。随时根据您的新要求提出新问题。 Stackoverflow 志愿者很乐意为您提供帮助。
  • @user3806999 如果我的Answer满足了您的Question,请点击空心处AcceptAnswer我的 Answer 旁边的复选标记位于 VoteDown 箭头下方,因此复选标记变为 green
猜你喜欢
  • 2018-01-08
  • 2016-10-28
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2012-11-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多