配置Selenium

时间:2017-01-13 06:08:46

标签: java selenium

因为我来过这里已经有一段时间了,我只是想重新熟悉我一直在研究的测试自动化框架。也许这是一个愚蠢的问题,但我会在大声思考的时候把它扔出去。

因为我已经引入了一个配置文件,其中包含excel文件的路径(包含测试数据)并实现了一个基本的Excel读取器来提取这些数据以进行测试,我发现我的初步测试主要是进行大量的完成所有这些设置。

例如:

  1. 创建ReadPropertyFile类的实例
  2. 创建ExcellDataConfig类的对象,并从配置文件中传递excel文件的位置
  3. 设置此测试的测试用例ID以扫描excel文件,从哪里开始从工作表中读取数据 - excel表包含标记
  4. 从我的测试所需的所有有趣内容的表格中获取位置rol / col信息,例如用户名/密码或其他一些数据
  5. 打开浏览器
  6. 如果为多个用户运行测试,则设置一个for循环,遍历excel表并登录,然后进行实际测试。
  7. 有很多配置选项但有更简单的方法吗?

    我有一个单独的TestBase类,其中包含登录类,我想有些人将这个用户登录信息移到那里,但不确定这是不是一个好主意。

    我只是不想陷入困境重复工作是否有人有任何高级别的建议?

2 个答案:

答案 0 :(得分:1)

所有这些“设置工作”,你所描述的实际上是非常常见的东西,它是AAA pattern真正起作用的方式:

  

用于在UnitTest方法中安排和格式化代码的模式

对于高级灯具用法,您可以使用最适合您的案例xUnit Setup pattern

我完全赞同@Würgspaß的评论。他所描述的内容被称为Object Map,我在过去3年中大量使用它,并在多个自动化项目中取得了巨大成功。

我没有在您的方案中看到任何特定框架的使用,因此我建议您选择一些成熟的框架,例如TestNGCucumber JVM。最后一个将提供Context injection,因此您可以始终获得可在场景运行期间共享上下文/状态的干净步骤定义对象。并且您将能够仅重复使用所有重型设置并在所有测试之间共享它。 I/O操作费用昂贵,可能会在更复杂的情况下导致问题,例如并行执行测试。

至于代码的设计,您可以找到一些非常有用的Selenium's Test design considerations,例如CallWrappers

答案 1 :(得分:1)

以下是一个可编译(但未完全编码)的快速而肮脏的示例,您可以如何为Selenium测试类设计基类

基类定义了一个登录/注销方法,该方法将在测试执行派生测试类之前/之后调用。

从Json文件(基于javax.json)读取数据,并用于定位元素(使用键)和输入数据(使用值)。您可以轻松扩展代码以支持处理其他元素或位置策略(css,xpath)。

请注意,此示例未针对性能进行优化。但它足够快,一开始就可以根据您的需要进行调整(例如,在静态环境中加载急切的数据)。

package myproject;

import java.io.*;
import java.util.*;

import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;

import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.*;

public class MyProjectBaseTest {    
    protected static WebDriver driver;

    @Before
    public void before() {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://myapp");
        login();
    }

    @After
    public void after() {
        logout();
    }

    private void login() {
        Map<String, String> data = readData("/path/to/testdata/login.json");

        Set<String> keys = data.keySet();
        for (String key : keys) {
            WebDriverWait wait = new WebDriverWait(driver, 20L);
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(key)));
            final WebElement we = driver.findElement(By.id(key));
            if ("input".equals(we.getTagName())) {
                we.clear();
                we.sendKeys(data.get(key));
            }
            //else if "button".equals(we.getTagName())
        }
    }

    private void logout() {
        //logout code ...
    }

    private Map<String, String> readData(String filename) {
        Map<String, String> data = new HashMap<String, String>();

        InputStream is = null;
        String key = null;        
        try {
            is = new FileInputStream(filename);
            JsonParser parser = Json.createParser(is);
            while (parser.hasNext()) {
                Event e = parser.next();
                if (e == Event.KEY_NAME) {
                    key = parser.getString();
                }
                if (e == Event.VALUE_STRING) {
                    data.put(key, parser.getString());
                }
            }
            parser.close();
        }
        catch (IOException e) {
            //error handling
        }
        finally {
            //close is
        }

        return data;
    }

}