【问题标题】:How to test for different usernames and passwords for same website using Selenium WebDriver elegantly?如何优雅地使用 Selenium WebDriver 测试同一网站的不同用户名和密码?
【发布时间】:2016-05-18 06:53:16
【问题描述】:

我有以下使用用户名和密码登录 Facebook 的示例代码,

@Test
    public void fb() {
        FirefoxProfile ffprofile = new FirefoxProfile();
        ffprofile.setPreference("general.useragent.override", "iPhone"); //this will change the user agent which will open mobile browser
        WebDriver driver = new FirefoxDriver(ffprofile);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().setSize(new Dimension(400, 800)); //just to change the window size so that it will look like mobile ;)
        driver.get("http://www.fb.com/");
        driver.findElement(By.name("email")).sendKeys("user1");
        driver.findElement(By.name("pass")).sendKeys("password");
        driver.findElement(By.name("login")).click();
    }

接下来我还有 5 个 Facebook 个人资料,分别是 user2、user3、user4、user5 和 user6。我也想使用这些个人资料登录 Facebook 进行一些自动化测试。

我的问题是我应该为不同的用户名重新编写上面的代码 5 次,还是有其他优雅的方法来实现这一点?

提前致谢!

【问题讨论】:

  • 基于关键字的测试。 en.wikipedia.org/wiki/Keyword-driven_testing 您将对一组给定的关键字(在本例中为用户/密码对)重复测试。您的函数需要将值作为参数:public void fb(String user, String password) {... .sendKeys(user).... sendKeys(password)....

标签: java selenium


【解决方案1】:

你没有提到你使用的是哪个测试框架,所以

  • 如果这是 JUnit,您可以使用 Parameterized tests。它们将允许您使用各种参数运行相同的测试:

    @RunWith(Parameterized.class)
    public class LoginTest {
        @Parameters
        public static Collection<Object[]> data() {
            return Arrays.asList(new Object[][] {     
             { "user1", "password" }, 
             { "user2", "password" } //...
        });
    }
    
    private String username, password;
    
    public LoginTest(String username, String password) {
         this.username = username;
         this.password = password;
    }
    
    @Test
    public void fb() {
        // most of it won't change, except:
        driver.findElement(By.name("email")).sendKeys(username);
        driver.findElement(By.name("pass")).sendKeys(password);
        // ...
    }
    
  • Nunit 有一个similar concept

  • 最后,如果你不能使用这些优点,你可以创建一个代表你的登录函数的函数,并从 5 个不同的测试中调用它。这样你仍然有一些测试调用的冗余,但没有登录代码:

    private WebDriver driver;
    
    public void login(String username, String password) {
        driver.findElement(By.name("email")).sendKeys(username);
        driver.findElement(By.name("pass")).sendKeys(password);
        driver.findElement(By.name("login")).click();
    }
    
    // Move code to init driver to run before every test
    @Before
    public void initDriver() {
        FirefoxProfile ffprofile = new FirefoxProfile();
        ffprofile.setPreference("general.useragent.override", "iPhone"); //this will change the user agent which will open mobile browser
        driver = new FirefoxDriver(ffprofile);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().setSize(new Dimension(400, 800)); //just to change the window size so that it will look like mobile ;)
        driver.get("http://www.fb.com/");
    }
    
    @Test
    public void fb1() {
        login("user1", "password");
    }
    
    @Test
    public void fb2() {
        login("user2", "password");
    }
    
    // etc
    

顺便说一句:初始化驱动程序每个类一次是一个更好的主意,因为配置文件创建/启动浏览器是一项昂贵的操作,如果您有很多测试,它可能会减慢您的速度。您还应该考虑在每次测试后退出,以便下次登录是干净的。

【讨论】:

  • 我在这里使用 JUnit。但是,您最后建议的方法似乎解决了我的问题。谢谢!
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2022-07-08
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多