Skip to content

Commit c8e2453

Browse files
authored
Click and Goto tests refactors (#1023)
* First tests * New click test class * Move tests * Click and Goto tests refactors * CodeFactor * Remove unused string
1 parent 6fe099f commit c8e2453

File tree

3 files changed

+292
-251
lines changed

3 files changed

+292
-251
lines changed
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using PuppeteerSharp.Input;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
8+
namespace PuppeteerSharp.Tests.InputTests
9+
{
10+
[Collection("PuppeteerLoaderFixture collection")]
11+
public class ClickTests : PuppeteerPageBaseTest
12+
{
13+
public ClickTests(ITestOutputHelper output) : base(output)
14+
{
15+
}
16+
17+
[Fact]
18+
public async Task ShouldClickTheButton()
19+
{
20+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
21+
await Page.ClickAsync("button");
22+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync<string>("result"));
23+
}
24+
25+
[Fact]
26+
public async Task ShouldClickTheButtonIfWindowNodeIsRemoved()
27+
{
28+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
29+
await Page.EvaluateExpressionAsync("delete window.Node");
30+
await Page.ClickAsync("button");
31+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync("result"));
32+
}
33+
34+
[Fact]
35+
public async Task ShouldClickTheButtonAfterNavigation()
36+
{
37+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
38+
await Page.ClickAsync("button");
39+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
40+
await Page.ClickAsync("button");
41+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync<string>("result"));
42+
}
43+
44+
[Fact]
45+
public async Task ShouldClickWithDisabledJavascript()
46+
{
47+
await Page.SetJavaScriptEnabledAsync(false);
48+
await Page.GoToAsync(TestConstants.ServerUrl + "/wrappedlink.html");
49+
await Task.WhenAll(
50+
Page.ClickAsync("a"),
51+
Page.WaitForNavigationAsync()
52+
);
53+
Assert.Equal(TestConstants.ServerUrl + "/wrappedlink.html#clicked", Page.Url);
54+
}
55+
56+
[Fact]
57+
public async Task ShouldSelectTheTextByTripleClicking()
58+
{
59+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/textarea.html");
60+
await Page.FocusAsync("textarea");
61+
const string text = "This is the text that we are going to try to select. Let's see how it goes.";
62+
await Page.Keyboard.TypeAsync(text);
63+
await Page.ClickAsync("textarea");
64+
await Page.ClickAsync("textarea", new ClickOptions { ClickCount = 2 });
65+
await Page.ClickAsync("textarea", new ClickOptions { ClickCount = 3 });
66+
Assert.Equal(text, await Page.EvaluateExpressionAsync<string>("window.getSelection().toString()"));
67+
}
68+
69+
[Fact]
70+
public async Task ShouldClickOffscreenButtons()
71+
{
72+
await Page.GoToAsync(TestConstants.ServerUrl + "/offscreenbuttons.html");
73+
var messages = new List<string>();
74+
Page.Console += (sender, e) => messages.Add(e.Message.Text);
75+
76+
for (var i = 0; i < 11; ++i)
77+
{
78+
// We might've scrolled to click a button - reset to (0, 0).
79+
await Page.EvaluateFunctionAsync("() => window.scrollTo(0, 0)");
80+
await Page.ClickAsync($"#btn{i}");
81+
}
82+
Assert.Equal(new List<string>
83+
{
84+
"button #0 clicked",
85+
"button #1 clicked",
86+
"button #2 clicked",
87+
"button #3 clicked",
88+
"button #4 clicked",
89+
"button #5 clicked",
90+
"button #6 clicked",
91+
"button #7 clicked",
92+
"button #8 clicked",
93+
"button #9 clicked",
94+
"button #10 clicked"
95+
}, messages);
96+
}
97+
98+
[Fact]
99+
public async Task ShouldClickWrappedLinks()
100+
{
101+
await Page.GoToAsync(TestConstants.ServerUrl + "/wrappedlink.html");
102+
await Page.ClickAsync("a");
103+
Assert.True(await Page.EvaluateExpressionAsync<bool>("window.__clicked"));
104+
}
105+
106+
[Fact]
107+
public async Task ShouldClickOnCheckboxInputAndToggle()
108+
{
109+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/checkbox.html");
110+
Assert.Null(await Page.EvaluateExpressionAsync("result.check"));
111+
await Page.ClickAsync("input#agree");
112+
Assert.True(await Page.EvaluateExpressionAsync<bool>("result.check"));
113+
Assert.Equal(new[] {
114+
"mouseover",
115+
"mouseenter",
116+
"mousemove",
117+
"mousedown",
118+
"mouseup",
119+
"click",
120+
"input",
121+
"change"
122+
}, await Page.EvaluateExpressionAsync<string[]>("result.events"));
123+
await Page.ClickAsync("input#agree");
124+
Assert.False(await Page.EvaluateExpressionAsync<bool>("result.check"));
125+
}
126+
127+
[Fact]
128+
public async Task ShouldClickOnCheckboxLabelAndToggle()
129+
{
130+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/checkbox.html");
131+
Assert.Null(await Page.EvaluateExpressionAsync("result.check"));
132+
await Page.ClickAsync("label[for=\"agree\"]");
133+
Assert.True(await Page.EvaluateExpressionAsync<bool>("result.check"));
134+
Assert.Equal(new[] {
135+
"click",
136+
"input",
137+
"change"
138+
}, await Page.EvaluateExpressionAsync<string[]>("result.events"));
139+
await Page.ClickAsync("label[for=\"agree\"]");
140+
Assert.False(await Page.EvaluateExpressionAsync<bool>("result.check"));
141+
}
142+
143+
[Fact]
144+
public async Task ShouldFailToClickAMissingButton()
145+
{
146+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
147+
var exception = await Assert.ThrowsAsync<SelectorException>(()
148+
=> Page.ClickAsync("button.does-not-exist"));
149+
Assert.Equal("No node found for selector: button.does-not-exist", exception.Message);
150+
Assert.Equal("button.does-not-exist", exception.Selector);
151+
}
152+
153+
[Fact]
154+
public async Task ShouldScrollAndClickTheButton()
155+
{
156+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/scrollable.html");
157+
await Page.ClickAsync("#button-5");
158+
Assert.Equal("clicked", await Page.EvaluateExpressionAsync<string>("document.querySelector(\"#button-5\").textContent"));
159+
await Page.ClickAsync("#button-80");
160+
Assert.Equal("clicked", await Page.EvaluateExpressionAsync<string>("document.querySelector(\"#button-80\").textContent"));
161+
}
162+
163+
[Fact]
164+
public async Task ShouldDoubleClickTheButton()
165+
{
166+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
167+
await Page.EvaluateExpressionAsync(@"{
168+
window.double = false;
169+
const button = document.querySelector('button');
170+
button.addEventListener('dblclick', event => {
171+
window.double = true;
172+
});
173+
}");
174+
var button = await Page.QuerySelectorAsync("button");
175+
await button.ClickAsync(new ClickOptions { ClickCount = 2 });
176+
Assert.True(await Page.EvaluateExpressionAsync<bool>("double"));
177+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync<string>("result"));
178+
}
179+
180+
[Fact]
181+
public async Task ShouldClickAPartiallyObscuredButton()
182+
{
183+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
184+
await Page.EvaluateExpressionAsync(@"{
185+
const button = document.querySelector('button');
186+
button.textContent = 'Some really long text that will go offscreen';
187+
button.style.position = 'absolute';
188+
button.style.left = '368px';
189+
}");
190+
await Page.ClickAsync("button");
191+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync<string>("result"));
192+
}
193+
194+
[Fact]
195+
public async Task ShouldClickARotatedButton()
196+
{
197+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/rotatedButton.html");
198+
await Page.ClickAsync("button");
199+
Assert.Equal("Clicked", await Page.EvaluateExpressionAsync<string>("result"));
200+
}
201+
202+
[Fact]
203+
public async Task ShouldFireContextmenuEventOnRightClick()
204+
{
205+
await Page.GoToAsync(TestConstants.ServerUrl + "/input/scrollable.html");
206+
await Page.ClickAsync("#button-8", new ClickOptions { Button = MouseButton.Right });
207+
Assert.Equal("context menu", await Page.EvaluateExpressionAsync<string>("document.querySelector('#button-8').textContent"));
208+
}
209+
210+
// @see https://github.com/GoogleChrome/puppeteer/issues/206
211+
[Fact]
212+
public async Task ShouldClickLinksWhichCauseNavigation()
213+
{
214+
await Page.SetContentAsync($"<a href=\"{TestConstants.EmptyPage}\">empty.html</a>");
215+
// This await should not hang.
216+
await Page.ClickAsync("a");
217+
}
218+
219+
[Fact]
220+
public async Task ShouldClickTheButtonInsideAnIframe()
221+
{
222+
await Page.GoToAsync(TestConstants.EmptyPage);
223+
await Page.SetContentAsync("<div style=\"width:100px;height:100px\">spacer</div>");
224+
await FrameUtils.AttachFrameAsync(Page, "button-test", TestConstants.ServerUrl + "/input/button.html");
225+
var frame = Page.FirstChildFrame();
226+
var button = await frame.QuerySelectorAsync("button");
227+
await button.ClickAsync();
228+
Assert.Equal("Clicked", await frame.EvaluateExpressionAsync<string>("window.result"));
229+
}
230+
231+
[Fact]
232+
public async Task ShouldClickTheButtonWithDeviceScaleFactorSet()
233+
{
234+
await Page.SetViewportAsync(new ViewPortOptions { Width = 400, Height = 400, DeviceScaleFactor = 5 });
235+
Assert.Equal(5, await Page.EvaluateExpressionAsync<int>("window.devicePixelRatio"));
236+
await Page.SetContentAsync("<div style=\"width:100px;height:100px\">spacer</div>");
237+
await FrameUtils.AttachFrameAsync(Page, "button-test", TestConstants.ServerUrl + "/input/button.html");
238+
var frame = Page.FirstChildFrame();
239+
var button = await frame.QuerySelectorAsync("button");
240+
await button.ClickAsync();
241+
Assert.Equal("Clicked", await frame.EvaluateExpressionAsync<string>("window.result"));
242+
}
243+
}
244+
}

0 commit comments

Comments
 (0)