有没有办法在很多页面上运行相同的Selenium测试用例,而没有专门定义页面列表?
比如说,我有一个像这样定义的UIMap页面集:
var map = new UIMap();
map.addPageset({
name: 'pages',
description: 'all pages',
pathRegexp: '^thisistheroot/$'
});
在页面集中,我为测试脚本定义了所有要在页面集中的每个页面上测试的元素。 所有这些都添加到我的核心扩展中。
我能在整个页面集上运行测试用例吗?我怎么能这样做?
我更多地研究了这个问题。詹金斯有没有办法实现这一点? https://jenkins-ci.org/
编辑:
我试图避免使用selenium webdriver,但是如果可以像在UIMap中那样获得链接,那么这可能也会指向正确的方向。我会尝试使用单个测试用例迭代链接,这可以很容易地在java中完成。顺便说一下,我正在使用java for webdriver。
感谢。
答案 0 :(得分:3)
简单的答案是" no"但是Selenium WebDriver
是确保找到页面链接并迭代它们的最佳选择之一。您的 UIMapping 的概念非常类似于PageFactory,您可以将所有页面元素映射到不同的类中,以使责任分离,从而使调试和重构更加容易。我使用了PageFactory概念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;
}
}
}
链接迭代器测试继承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();
}
}
}
注意:我正在使用TestNG来维护测试,请注意延迟加载页面,如果需要,您可能需要添加一些明确的等待
答案 1 :(得分:2)
实际上,针对1个特定页面(实际基本网址)运行IDE测试很简单:java -jar selenium-server.jar -htmlSuite "*firefox" "http://baseURL.com" "mytestsuite.html" "results.html"
所以你需要做的是使用jenkins(或任何bash / batch脚本)多次运行该命令,并将基本网址设置为&#34; http://baseURL.com/page1&#34;,&#34; http://baseURL.com/page2&#34;等等
这只会让您获得要测试的静态页面列表。如果你想要一个动态列表,你还必须&#34;抓取&#34;页面,您可以在类似的批处理/ bash脚本中执行此操作,以获取要测试的页面列表。
在这种情况下,您最好在selenium IDE之外进行投资并切换到webdriver,以便您拥有更多的循环和流量控制功能。