Skip to content

Commit

Permalink
Added right click support (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrote1 authored Apr 10, 2017
1 parent d8bf57b commit 91d2f5d
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 1 deletion.
19 changes: 18 additions & 1 deletion Xenon.Selenium/SeleniumXenonElement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,24 @@ public IXenonElement Click()
}
}

public IXenonElement EnterText( string value )
public IXenonElement RightClick()
{
try
{
new Actions( _webDriver ).ContextClick( _webElement ).Build().Perform();
return this;
}
catch ( StaleElementReferenceException )
{
throw new StaleElementException();
}
catch ( WebDriverException )
{
return RightClick();
}
}

public IXenonElement EnterText( string value )
{
try
{
Expand Down
118 changes: 118 additions & 0 deletions Xenon.Tests/RightClickTests/BaseRightClickTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using Moq;
using Moq.Language.Flow;
using NUnit.Framework;
using Xenon.Tests.ExtensionMethods;

namespace Xenon.Tests.RightClickTests
{
public abstract class BaseRightClickTests<T> : BaseXenonTest where T : BaseXenonTest<T>
{
protected abstract BaseXenonTest<T> CreateInstance( Mock<IXenonBrowser> browser );

[Test]
public void RightClick_WhenRightClicked_CallsBrowserRightClick()
{
const string cssSelector = "button";
var element = new Mock<IXenonElement>();
element.Setup( x => x.ScrollToElement() ).Returns( () => element.Object );

var browser = SetupBrowser();
browser.SetupFindElementsByCssSelector( cssSelector, element );

SetupExpectedSequenceForElement( element ).Returns( () => element.Object );

var xenonTest = CreateInstance( browser );
xenonTest.RightClick( cssSelector );

element.VerifyAll();
}

private static ISetup<IXenonElement, IXenonElement> SetupExpectedSequenceForElement( Mock<IXenonElement> element )
{
var sequence = new MockSequence();
element.InSequence( sequence ).Setup( x => x.ScrollToElement() ).Returns( () => element.Object );
return element.InSequence( sequence ).Setup( x => x.RightClick() );
}

[Test]
public void RightClick_WhenElementDoesNotExistStraightAway_WaitsForItThenRightClicks()
{
const string cssSelector = "button";
var element = new Mock<IXenonElement>();
element.Setup( x => x.ScrollToElement() ).Returns( () => element.Object );

var browser = SetupBrowser();
browser.SetupFindElementsByCssSelector( cssSelector, element, 5 );

SetupExpectedSequenceForElement( element ).Returns( () => element.Object );

var xenonTest = CreateInstance( browser );
xenonTest.RightClick( cssSelector );

element.VerifyAll();
}

[Test]
public void RightClick_WhenCustomPreWaitIsAssigned_ShouldWaitUponThatAssertion()
{
const string cssSelector = "button";
const string content = "Ready";
var element = new Mock<IXenonElement>();
element.Setup( x => x.ScrollToElement() ).Returns( () => element.Object );

const int timesToCallUrl = 5;
var timesCalled = 0;

var browser = SetupBrowser();
browser.SetupGet( x => x.PageSource )
.Returns( () => ++timesCalled < timesToCallUrl ? string.Empty : content );

browser.SetupFindElementsByCssSelector( cssSelector, element );
var calledToEarly = false;

SetupExpectedSequenceForElement( element ).Callback( () =>
{
if ( timesCalled != 5 )
calledToEarly = true;
} );

var xenonTest = CreateInstance( browser );
xenonTest.RightClick( cssSelector, x => x.PageContains( content ) );

Assert.IsFalse( calledToEarly );
}

[Test]
public void RightClick_WhenCustomPostWaitIsAssigned_ShouldWaitUponThatAssertion()
{
const string cssSelector = "button";
const string content = "Ready";
var element = new Mock<IXenonElement>();
element.Setup( x => x.ScrollToElement() ).Returns( () => element.Object );
element.Setup( x => x.IsVisible ).Returns( true );

const int timesToCallUrl = 5;
var timesCalled = 0;

var browser = SetupBrowser();
browser.SetupGet( x => x.PageSource )
.Returns( () => ++timesCalled < timesToCallUrl ? string.Empty : content );

browser.Setup( x => x.FindElementsByCssSelector( cssSelector ) )
.Returns( new List<IXenonElement>
{
element.Object
} );

SetupExpectedSequenceForElement( element );

var xenonTest = CreateInstance( browser );
xenonTest.RightClick( cssSelector, EmptyAssertion, x => x.PageContains( content ) );


Assert.AreEqual( timesToCallUrl, timesCalled );
}
}
}
14 changes: 14 additions & 0 deletions Xenon.Tests/RightClickTests/XenonScreenRightClickTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Moq;
using NUnit.Framework;

namespace Xenon.Tests.RightClickTests
{
[TestFixture]
public class XenonScreenRightClickTests : BaseRightClickTests<DummyXenonScreen>
{
protected override BaseXenonTest<DummyXenonScreen> CreateInstance( Mock<IXenonBrowser> browser )
{
return new DummyXenonScreen( browser.Object );
}
}
}
14 changes: 14 additions & 0 deletions Xenon.Tests/RightClickTests/XenonTestRightClickTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Moq;
using NUnit.Framework;

namespace Xenon.Tests.RightClickTests
{
[TestFixture]
public class XenonTestRightClickTests : BaseRightClickTests<XenonTest>
{
protected override BaseXenonTest<XenonTest> CreateInstance( Mock<IXenonBrowser> browser )
{
return new XenonTest( browser.Object );
}
}
}
3 changes: 3 additions & 0 deletions Xenon.Tests/Xenon.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@
<Compile Include="GoToUrlTests\BaseGoToUrlTests.cs" />
<Compile Include="ClickTests\XenonTestClickTests.cs" />
<Compile Include="GoToUrlTests\XenonTestGoToUrlTests.cs" />
<Compile Include="RightClickTests\BaseRightClickTests.cs" />
<Compile Include="RightClickTests\XenonScreenRightClickTests.cs" />
<Compile Include="RightClickTests\XenonTestRightClickTests.cs" />
<Compile Include="SwitchToWindowTests\BaseSwitchToWindowTests.cs" />
<Compile Include="SwitchToWindowTests\XenonScreenSwitchToWindowTests.cs" />
<Compile Include="SwitchToWindowTests\XenonTestSwitchToWindowTests.cs" />
Expand Down
14 changes: 14 additions & 0 deletions Xenon/BaseXenonTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,20 @@ public T Click( string cssSelector, AssertionFunc customPreWait = null, Assertio
customPostWait );
}

/// <summary>
/// Right clicks the element specified
/// By default waits for the element to exist before clicking
/// </summary>
/// <param name="cssSelector">The css selector of the element</param>
/// <param name="customPreWait">Custom action wait upon before clicking to the element</param>
/// <param name="customPostWait">Custom action wait upon after clicking to the element</param>
public T RightClick( string cssSelector, AssertionFunc customPreWait = null, AssertionFunc customPostWait = null )
{
return RunTask( browser => browser.FindElementsByCssSelector( cssSelector ).LocateFirstVisibleElement().RightClick(),
customPreWait ?? ( a => a.CustomAssertion( browser => browser.FindElementsByCssSelector( cssSelector ).LocateFirstVisibleElement().IsVisible ) ),
customPostWait );
}


/// <summary>
/// Clicks the element specified
Expand Down
1 change: 1 addition & 0 deletions Xenon/IXenonElement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public interface IXenonElement
{
IXenonElement Click();
IXenonElement RightClick();
IXenonElement EnterText( string value );
bool IsVisible { get; }
string Text { get; }
Expand Down

0 comments on commit 91d2f5d

Please sign in to comment.