blob: 64dc69e14ce31aeb0d65b167a3302883d9ba54a1 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Text;
using NMock2;
using NUnit.Framework;
using System.Collections;
using System.Collections.ObjectModel;
using OpenQA.Selenium.Internal;
namespace OpenQA.Selenium.Support.Events
{
[TestFixture]
public class EventFiringWebDriverTest
{
private Mockery mocks;
private IWebDriver mockDriver;
private IWebElement mockElement;
private INavigation mockNavigation;
private StringBuilder log;
[SetUp]
public void Setup()
{
mocks = new Mockery();
mockDriver = mocks.NewMock<IWebDriver>();
mockElement = mocks.NewMock<IWebElement>();
mockNavigation = mocks.NewMock<INavigation>();
log = new StringBuilder();
}
[Test]
public void ShouldFireNavigationEvents()
{
Expect.Once.On(mockDriver).SetProperty("Url").To("http://www.get.com");
Expect.Exactly(3).On(mockDriver).Method("Navigate").Will(Return.Value(mockNavigation));
Expect.Once.On(mockNavigation).Method("GoToUrl").With("http://www.navigate-to.com");
Expect.Once.On(mockNavigation).Method("Back");
Expect.Once.On(mockNavigation).Method("Forward");
EventFiringWebDriver firingDriver = new EventFiringWebDriver(mockDriver);
firingDriver.Navigating += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_Navigating);
firingDriver.Navigated += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_Navigated);
firingDriver.NavigatingBack += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_NavigatingBack);
firingDriver.NavigatedBack += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_NavigatedBack);
firingDriver.NavigatingForward += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_NavigatingForward);
firingDriver.NavigatedForward += new EventHandler<WebDriverNavigationEventArgs>(firingDriver_NavigatedForward);
firingDriver.Url = "http://www.get.com";
firingDriver.Navigate().GoToUrl("http://www.navigate-to.com");
firingDriver.Navigate().Back();
firingDriver.Navigate().Forward();
string expectedLog = @"Navigating http://www.get.com
Navigated http://www.get.com
Navigating http://www.navigate-to.com
Navigated http://www.navigate-to.com
Navigating back
Navigated back
Navigating forward
Navigated forward
";
Assert.AreEqual(expectedLog, log.ToString());
}
[Test]
public void ShouldFireClickEvent()
{
Expect.Once.On(mockDriver).Method("FindElement").With(By.Name("foo")).Will(Return.Value(mockElement));
Expect.Once.On(mockElement).Method("Click");
EventFiringWebDriver firingDriver = new EventFiringWebDriver(mockDriver);
firingDriver.ElementClicking += new EventHandler<WebElementEventArgs>(firingDriver_ElementClicking);
firingDriver.ElementClicked += new EventHandler<WebElementEventArgs>(firingDriver_ElementClicked);
firingDriver.FindElement(By.Name("foo")).Click();
string expectedLog = @"Clicking
Clicked
";
Assert.AreEqual(expectedLog, log.ToString());
}
[Test]
public void ShouldFireFindByEvent()
{
IList<IWebElement> driverElements = new List<IWebElement>();
IList<IWebElement> subElements = new List<IWebElement>();
Expect.Once.On(mockDriver).Method("FindElement").With(By.Id("foo")).Will(Return.Value(mockElement));
Expect.Once.On(mockElement).Method("FindElement").With(By.LinkText("bar"));
Expect.Once.On(mockElement).Method("FindElements").With(By.Name("xyz")).Will(Return.Value(new ReadOnlyCollection<IWebElement>(driverElements)));
Expect.Once.On(mockDriver).Method("FindElements").With(By.XPath("//link[@type = 'text/css']")).Will(Return.Value(new ReadOnlyCollection<IWebElement>(subElements)));
EventFiringWebDriver firingDriver = new EventFiringWebDriver(mockDriver);
firingDriver.FindingElement += new EventHandler<FindElementEventArgs>(firingDriver_FindingElement);
firingDriver.FindElementCompleted += new EventHandler<FindElementEventArgs>(firingDriver_FindElementCompleted);
IWebElement element = firingDriver.FindElement(By.Id("foo"));
element.FindElement(By.LinkText("bar"));
element.FindElements(By.Name("xyz"));
firingDriver.FindElements(By.XPath("//link[@type = 'text/css']"));
string expectedLog = @"FindingElement from IWebDriver By.Id: foo
FindElementCompleted from IWebDriver By.Id: foo
FindingElement from IWebElement By.LinkText: bar
FindElementCompleted from IWebElement By.LinkText: bar
FindingElement from IWebElement By.Name: xyz
FindElementCompleted from IWebElement By.Name: xyz
FindingElement from IWebDriver By.XPath: //link[@type = 'text/css']
FindElementCompleted from IWebDriver By.XPath: //link[@type = 'text/css']
";
Assert.AreEqual(expectedLog, log.ToString());
}
[Test]
public void ShouldCallListenerOnException()
{
NoSuchElementException exception = new NoSuchElementException("argh");
Expect.Once.On(mockDriver).Method("FindElement").With(By.Id("foo")).Will(Throw.Exception(exception));
EventFiringWebDriver firingDriver = new EventFiringWebDriver(mockDriver);
firingDriver.ExceptionThrown += new EventHandler<WebDriverExceptionEventArgs>(firingDriver_ExceptionThrown);
try
{
firingDriver.FindElement(By.Id("foo"));
Assert.Fail("Expected exception to be propogated");
}
catch (NoSuchElementException)
{
// Fine
}
Assert.IsTrue(log.ToString().Contains(exception.Message));
}
[Test]
public void ShouldUnwrapElementArgsWhenCallingScripts()
{
IExecutingDriver executingDriver = mocks.NewMock<IExecutingDriver>();
Expect.Once.On(executingDriver).Method("FindElement").With(By.Id("foo")).Will(Return.Value(mockElement));
Expect.Once.On(executingDriver).Method("ExecuteScript").With("foo", new[] { mockElement }).Will(Return.Value("foo"));
EventFiringWebDriver testedDriver = new EventFiringWebDriver(executingDriver);
IWebElement element = testedDriver.FindElement(By.Id("foo"));
try
{
testedDriver.ExecuteScript("foo", element);
}
catch (Exception e)
{
// This is the error we're trying to fix
throw e;
}
}
[Test]
public void ShouldBeAbleToWrapSubclassesOfSomethingImplementingTheWebDriverInterface()
{
// We should get this far
EventFiringWebDriver testDriver = new EventFiringWebDriver(new ChildDriver());
}
[Test]
public void ShouldBeAbleToAccessWrappedInstanceFromEventCalls()
{
mockDriver = new StubDriver();
EventFiringWebDriver testDriver = new EventFiringWebDriver(mockDriver);
StubDriver wrapped = ((IWrapsDriver)testDriver).WrappedDriver as StubDriver;
Assert.AreEqual(mockDriver, wrapped);
testDriver.Navigating += new EventHandler<WebDriverNavigationEventArgs>(testDriver_Navigating);
testDriver.Url = "http://example.org";
}
void testDriver_Navigating(object sender, WebDriverNavigationEventArgs e)
{
Assert.AreEqual(e.Driver, mockDriver);
}
void firingDriver_ExceptionThrown(object sender, WebDriverExceptionEventArgs e)
{
log.AppendLine(e.ThrownException.Message);
}
void firingDriver_FindingElement(object sender, FindElementEventArgs e)
{
log.Append("FindingElement from ").Append(e.Element == null ? "IWebDriver " : "IWebElement ").AppendLine(e.FindMethod.ToString());
}
void firingDriver_FindElementCompleted(object sender, FindElementEventArgs e)
{
log.Append("FindElementCompleted from ").Append(e.Element == null ? "IWebDriver " : "IWebElement ").AppendLine(e.FindMethod.ToString());
}
void firingDriver_ElementClicking(object sender, WebElementEventArgs e)
{
log.AppendLine("Clicking");
}
void firingDriver_ElementClicked(object sender, WebElementEventArgs e)
{
log.AppendLine("Clicked");
}
void firingDriver_Navigating(object sender, WebDriverNavigationEventArgs e)
{
log.Append("Navigating ").Append(e.Url).AppendLine();
}
void firingDriver_Navigated(object sender, WebDriverNavigationEventArgs e)
{
log.Append("Navigated ").Append(e.Url).AppendLine();
}
void firingDriver_NavigatingBack(object sender, WebDriverNavigationEventArgs e)
{
log.AppendLine("Navigating back");
}
void firingDriver_NavigatedBack(object sender, WebDriverNavigationEventArgs e)
{
log.AppendLine("Navigated back");
}
void firingDriver_NavigatingForward(object sender, WebDriverNavigationEventArgs e)
{
log.AppendLine("Navigating forward");
}
void firingDriver_NavigatedForward(object sender, WebDriverNavigationEventArgs e)
{
log.AppendLine("Navigated forward");
}
public interface IExecutingDriver : IWebDriver, IJavaScriptExecutor
{
}
public class ChildDriver : StubDriver
{
}
}
}