Skip to content

Commit a591496

Browse files
chrisblockjimevans
authored andcommitted
Changes to .NET ExecuteJavaScript extension method for converting result
Now validates that the ExecuteJavaScript extension method will correctly detect if the script result is convertable to the generic type. Signed-off-by: Jim Evans <[email protected]>
1 parent dfb5446 commit a591496

File tree

3 files changed

+106
-1
lines changed

3 files changed

+106
-1
lines changed

Diff for: dotnet/src/support/Extensions/WebDriverExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public static T ExecuteJavaScript<T>(this IWebDriver driver, string script, para
8686
}
8787

8888
object result = executor.ExecuteScript(script, args);
89-
if (!result.GetType().IsAssignableFrom(typeof(T)))
89+
if (typeof (T).IsInstanceOfType(result) == false)
9090
{
9191
throw new WebDriverException("Script returned a value, but the result could not be cast to the desired type");
9292
}
+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using System.Collections.ObjectModel;
4+
5+
using NMock2;
6+
7+
using NUnit.Framework;
8+
9+
namespace OpenQA.Selenium.Support.Extensions
10+
{
11+
public interface IJavaScriptExecutingWebDriver : IWebDriver, IJavaScriptExecutor
12+
{
13+
}
14+
15+
public class SubClassOfReadOnlyCollectionOfObject : ReadOnlyCollection<object>
16+
{
17+
public SubClassOfReadOnlyCollectionOfObject(IList<object> list) : base(list)
18+
{
19+
}
20+
}
21+
22+
[TestFixture]
23+
public class ExecuteJavaScriptTest
24+
{
25+
private const string JavaScript = "Hello, World";
26+
private static readonly object[] JavaScriptParameters = new object[0];
27+
28+
private Mockery mocks;
29+
private IJavaScriptExecutingWebDriver driver;
30+
31+
[SetUp]
32+
public void TestSetUp()
33+
{
34+
mocks = new Mockery();
35+
36+
driver = mocks.NewMock<IJavaScriptExecutingWebDriver>();
37+
}
38+
39+
[Test]
40+
public void ShouldConvertToIEnumerable()
41+
{
42+
var expected = new ReadOnlyCollection<object>(new List<object>());
43+
44+
Expect.Once.On(driver)
45+
.Method("ExecuteScript")
46+
.With(JavaScript, JavaScriptParameters)
47+
.Will(Return.Value(expected));
48+
49+
Assert.That(() => driver.ExecuteJavaScript<IEnumerable>(JavaScript, JavaScriptParameters), Throws.Nothing);
50+
}
51+
52+
[Test]
53+
public void ShouldConvertToIEnumerableOfObject()
54+
{
55+
var expected = new ReadOnlyCollection<object>(new List<object>());
56+
57+
Expect.Once.On(driver)
58+
.Method("ExecuteScript")
59+
.With(JavaScript, JavaScriptParameters)
60+
.Will(Return.Value(expected));
61+
62+
Assert.That(() => driver.ExecuteJavaScript<IEnumerable<object>>(JavaScript, JavaScriptParameters), Throws.Nothing);
63+
}
64+
65+
[Test]
66+
public void ShouldNotConvertToIEnumerableOfInteger()
67+
{
68+
var expected = new ReadOnlyCollection<object>(new List<object>());
69+
70+
Expect.Once.On(driver)
71+
.Method("ExecuteScript")
72+
.With(JavaScript, JavaScriptParameters)
73+
.Will(Return.Value(expected));
74+
75+
Assert.That(() => driver.ExecuteJavaScript<IEnumerable<int>>(JavaScript, JavaScriptParameters), Throws.InstanceOf<WebDriverException>());
76+
}
77+
78+
[Test]
79+
public void ShouldConvertToReadOnlyCollectionOfObject()
80+
{
81+
var expected = new ReadOnlyCollection<object>(new List<object>());
82+
83+
Expect.Once.On(driver)
84+
.Method("ExecuteScript")
85+
.With(JavaScript, JavaScriptParameters)
86+
.Will(Return.Value(expected));
87+
88+
Assert.That(() => driver.ExecuteJavaScript<ReadOnlyCollection<object>>(JavaScript, JavaScriptParameters), Throws.Nothing);
89+
}
90+
91+
[Test]
92+
public void ShouldNotConvertToSubClassOfReadOnlyCollectionOfObject()
93+
{
94+
var expected = new ReadOnlyCollection<object>(new List<object>());
95+
96+
Expect.Once.On(driver)
97+
.Method("ExecuteScript")
98+
.With(JavaScript, JavaScriptParameters)
99+
.Will(Return.Value(expected));
100+
101+
Assert.That(() => driver.ExecuteJavaScript<SubClassOfReadOnlyCollectionOfObject>(JavaScript, JavaScriptParameters), Throws.InstanceOf<WebDriverException>());
102+
}
103+
}
104+
}

Diff for: dotnet/test/support/WebDriver.Support.Tests.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
</ItemGroup>
7979
<ItemGroup>
8080
<Compile Include="Events\EventFiringWebDriverTest.cs" />
81+
<Compile Include="Extensions\ExecuteJavaScriptTest.cs" />
8182
<Compile Include="PageObjects\ByChainedBrowserTests.cs" />
8283
<Compile Include="PageObjects\ByChainedTests.cs" />
8384
<Compile Include="PageObjects\FindsByAttributeTests.cs" />

0 commit comments

Comments
 (0)