Selenium IDE/Builder 运行 可以在多个页面上使用相同的测试用例吗?

Can Selenium IDE/Builder run same test case on many pages?

有没有办法 运行 在许多页面上使用相同的 Selenium 测试用例而无需专门定义页面列表?

比如说,我有一个定义如下的 UIMap 页面集:

var map = new UIMap();
map.addPageset({
    name: 'pages',
    description: 'all pages',
    pathRegexp: '^thisistheroot/$'
});

在页面集中,我为要在页面集中的每个页面上测试的测试脚本定义了所有元素。 所有这些都添加到我的核心扩展中。

我可以 运行 整个页面集上的测试用例吗?我该怎么做?

我进一步调查了这个问题。詹金斯有没有办法做到这一点? https://jenkins-ci.org/

编辑:

我试图避免使用 selenium webdriver,但如果可以像在 UIMap 中那样获取链接,那可能也会为我指明正确的方向。我会尝试使用单个测试用例迭代链接,这可以在 java 中轻松完成。顺便说一句,我正在使用 java 作为 webdriver。

谢谢。

简单的答案是 "no",但 Selenium WebDriver 是确保找到页面链接并遍历它们的最佳选择之一。您的 UIMapping 有一个非常相似的概念,称为 PageFactory where you map all the page elements in separate classes to keep the responsibility separate which makes debugging and refactoring much easier. I have used the PageFactory concept here

现在回到您的问题,您可以轻松找到页面中存在的链接列表。在那种情况下,您只需要仔细编写选择器即可。然后您可以轻松地遍历链接并来回等等。

关于 Google

的概念验证

BasePage

package google;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.NoSuchElementException;

/**
 * Defines the generic methods/functions for PageObjects.
 */
public class BaseClass {

    protected WebDriver driver;

    /**
     * @param _driver
     * @param byKnownElement
     */
    public BaseClass(WebDriver _driver, By byKnownElement) {

        //assigning driver instance globally.
        driver = _driver;
        this.correctPageLoadedCheck(byKnownElement);

        /* Instantiating all elements since this is super class
        and inherited by each and every page object */
        PageFactory.initElements(driver, this);
    }

    /**
     * Verifies correct page was returned.
     *
     * @param by
     */
    private void correctPageLoadedCheck(By by) {

        try {

            driver.findElement(by).isDisplayed();

        } catch (NoSuchElementException ex) {

            throw ex;
        }
    }
}

PageObject继承BasePage

package google;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

import java.util.List;

/**
 * Created by Saifur on 5/30/2015.
 */
public class GoogleLandingPage extends BaseClass {


    private static final By byKnownElement = By.xpath("//a[text()='Sign in']");

    /**
     * @param _driver
     */

    public GoogleLandingPage(WebDriver _driver) {
        super(_driver, byKnownElement);
    }

    //This should find all the links of the page
    //You need to write the selector such a way
    // so that it will grab all intended links.
    @FindBy(how = How.CSS,using = ".gb_e.gb_0c.gb_r.gb_Zc.gb_3c.gb_oa>div:first-child a")
    public List<WebElement> ListOfLinks;
}

BaseTest

package tests;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseTest {


    public WebDriver driver;
    String url = "https://www.google.com/";


    @BeforeClass
    public void SetUpTests() {

        driver = new FirefoxDriver();
        //Navigate to url
        driver.navigate().to(url);
        //Maximize the browser window
        driver.manage().window().maximize();
    }

    @AfterClass
    public void CleanUpDriver() throws Exception {
        try {

            driver.quit();

        }catch (Exception ex){

            throw ex;
        }
    }
} 

Link迭代器测试继承BaseTest

package tests;

import google.GoogleLandingPage;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

import java.util.List;

/**
 * Created by Saifur on 5/30/2015.
 */
public class LinksIteratorTests extends BaseTest {

    @Test
    public void IterateOverLinks(){
        GoogleLandingPage google = new GoogleLandingPage(driver);

        List<WebElement> elementList = google.ListOfLinks;

        for (int i=0;i<elementList.size(); i++){
            elementList.get(i).click();
            //possibly do something else to go back to the previous page
            driver.navigate().back();
        }
    }
}

Note: I am using TestNG to maintain the tests and please note for lazy loading page you may need to add some explicit wait if necessary

实际上,运行 针对 1 个特定页面进行 IDE 测试很简单(实际上是基础 url):java -jar selenium-server.jar -htmlSuite "*firefox" "http://baseURL.com" "mytestsuite.html" "results.html"

因此,您需要做的是使用 jenkins(或任何 bash/batch 脚本)对 运行 执行多次命令,并将基础 url 设置为“http://baseURL.com/page1", "http://baseURL.com/page2 "等

这只会让您了解要测试的静态页面列表。如果你想要一个动态列表,你还必须 "crawl" 页面,你可以在类似的 batch/bash 脚本中这样做以获得要测试的页面列表。

在这种情况下,您最好投资于 selenium IDE 并切换到 webdriver,这样您将拥有更多的循环和流控制能力。