我正在寻找推荐/最好的方法让Selenium测试一个接一个地在几个浏览器中执行。我正在测试的网站并不大,所以我还不需要并行解决方案。
我有[SetUp]
,[TearDown]
和[Test]
常用的测试设置方法。当然,SetUp可以使用我想要测试的任何浏览器实例化一个新的ISelenium
对象。
所以我想做的是以编程方式说:这个测试将按顺序在Chrome,IE和Firefox上运行。我该怎么做?
编辑:
这可能会有所帮助。我们正在使用CruiseControl.NET在成功构建之后启动NUnit测试。有没有办法将参数传递给NUnit可执行文件,然后在测试中使用该参数?通过这种方式,我们可以使用不同的浏览器参数多次运行NUnit。
答案 0 :(得分:50)
NUnit 2.5+现在支持通用测试夹具,这使得在多个浏览器中进行测试变得非常简单。 http://www.nunit.org/index.php?p=testFixture&r=2.5
运行以下示例将执行两次GoogleTest,一次在Firefox中,一次在IE中。
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using System.Threading;
namespace SeleniumTests
{
[TestFixture(typeof(FirefoxDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new()
{
private IWebDriver driver;
[SetUp]
public void CreateDriver () {
this.driver = new TWebDriver();
}
[Test]
public void GoogleTest() {
driver.Navigate().GoToUrl("http://www.google.com/");
IWebElement query = driver.FindElement(By.Name("q"));
query.SendKeys("Bread" + Keys.Enter);
Thread.Sleep(2000);
Assert.AreEqual("bread - Google Search", driver.Title);
driver.Quit();
}
}
}
答案 1 :(得分:5)
这是一个反复出现的问题,可以通过以下几种方式解决:
工厂方法生成您的ISelenium对象 - 您有一个带有静态getSelenium方法的帮助器类。该方法读入一些外部配置,该配置具有将您想要的浏览器定义为字符串的属性。在getSelenium中,然后相应地配置浏览器。这是一篇关于使用配置文件和NUnit http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-about-the-nunit-file/
其他人通过IoC容器注入浏览器取得了成功。我真的很喜欢这个,因为TestNG在Java领域与Guice的合作非常好,但我不确定将NUnit和Ninject,MEF等混合起来是多么容易......
答案 2 :(得分:5)
这基本上只是对alanning的回答(10月21日和11月20日20:20)的扩展。我的情况类似,只是因为我不想使用无参数构造函数运行(因此使用驱动程序可执行文件的默认路径)。我有一个单独的文件夹,其中包含我想要测试的驱动程序,这似乎很好用:
[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class BrowserTests<TWebDriver> where TWebDriver : IWebDriver, new()
{
private IWebDriver _webDriver;
[SetUp]
public void SetUp()
{
string driversPath = Environment.CurrentDirectory + @"\..\..\..\WebDrivers\";
_webDriver = Activator.CreateInstance(typeof (TWebDriver), new object[] { driversPath }) as IWebDriver;
}
[TearDown]
public void TearDown()
{
_webDriver.Dispose(); // Actively dispose it, doesn't seem to do so itself
}
[Test]
public void Tests()
{
//TestCode
}
}
}
答案 3 :(得分:3)
我使用IWeb驱动程序列表逐行执行所有浏览器的测试:
[ClassInitialize]
public static void ClassInitialize(TestContext context) {
drivers = new List<IWebDriver>();
firefoxDriver = new FirefoxDriver();
chromeDriver = new ChromeDriver(path);
ieDriver = new InternetExplorerDriver(path);
drivers.Add(firefoxDriver);
drivers.Add(chromeDriver);
drivers.Add(ieDriver);
baseURL = "http://localhost:4444/";
}
[ClassCleanup]
public static void ClassCleanup() {
drivers.ForEach(x => x.Quit());
}
..and then am able to write tests like this:
[TestMethod]
public void LinkClick() {
WaitForElementByLinkText("Link");
drivers.ForEach(x => x.FindElement(By.LinkText("Link")).Click());
AssertIsAllTrue(x => x.PageSource.Contains("test link"));
}
..我在编写自己的方法WaitForElementByLinkText和AssertIsAllTrue来执行每个驱动程序的操作,并且在任何失败的地方输出一条消息,帮助我识别哪些浏览器可能已经失败:
public void WaitForElementByLinkText(string linkText) {
List<string> failedBrowsers = new List<string>();
foreach (IWebDriver driver in drivers) {
try {
WebDriverWait wait = new WebDriverWait(clock, driver, TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(250));
wait.Until((d) => { return d.FindElement(By.LinkText(linkText)).Displayed; });
} catch (TimeoutException) {
failedBrowsers.Add(driver.GetType().Name + " Link text: " + linkText);
}
}
Assert.IsTrue(failedBrowsers.Count == 0, "Failed browsers: " + string.Join(", ", failedBrowsers));
}
IEDriver的速度非常缓慢但是这将有3个主要的浏览器并行运行测试'
答案 4 :(得分:1)
好的,一个解决方案是使用包装器测试来设置不同浏览器的ISelenium对象。然后他们将该对象传递给使用它的所有其他测试,而不是像以前那样自己设置一个新对象。
缺点是,我最终对每个浏览器进行了一次大测试。也不是最好的解决方案。还在看......
编辑:
花了更多时间在这上面。我想出的解决方案是在解决方案中有一个文本文件,指定用于测试的浏览器。 NUnit在实例化Selenium对象时获取设置。
我正在使用CruiseControl.NET来运行自动构建和测试。而不只是运行测试一次,我配置它运行两次。但在每次测试之前,我都会运行命令行命令来更改配置文本文件中的浏览器。
<exec>
<executable>cmd</executable>
<buildArgs>/C echo firefox C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe > F:\...\selenium_browser.txt</buildArgs>
</exec>
<exec>
<executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
<baseDirectory>F:\...\bin\Debug</baseDirectory>
<buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
<successExitCodes>0</successExitCodes>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>
<exec>
<executable>cmd</executable>
<buildArgs>/C echo googlechrome C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe > F:\...\selenium_browser.txt</buildArgs>
</exec>
<exec>
<executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
<baseDirectory>F:\...\bin\Debug</baseDirectory>
<buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
<successExitCodes>0</successExitCodes>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>
答案 5 :(得分:1)
这帮助我解决了类似的问题 How do I run a set of nUnit tests with two different setups?
只需在设置方法中设置不同的浏览器:]
答案 6 :(得分:1)
我想知道同样的问题,最后我got solution
因此,当您安装插件时,您就可以控制在哪种浏览器中测试场景。
功能示例:
@Browser:IE
@Browser:Chrome
Scenario Outline: Add Two Numbers
Given I navigated to /
And I have entered <SummandOne> into summandOne calculator
And I have entered <SummandTwo> into summandTwo calculator
When I press add
Then the result should be <Result> on the screen
Scenarios:
| SummandOne | SummandTwo | Result |
| 50 | 70 | 120 |
| 1 | 10 | 11 |
实施
[Given(@"I have entered '(.*)' into the commentbox")]
public void GivenIHaveEnteredIntoTheCommentbox(string p0)
{
Browser.Current.FindElement(By.Id("comments")).SendKeys(p0);
}
答案 7 :(得分:0)
必须是更好的方法,但您可以使用T4 templates为每个浏览器生成重复的测试类 - 实质上是为每个浏览器自动复制和粘贴测试。