Skip to content
This repository was archived by the owner on Nov 24, 2018. It is now read-only.

Commit 978fd2e

Browse files
zaaackadieuadieu
authored andcommitted
fix: load event not fired when page load very fast (fix #277, #297) (#400)
Closes #277 Closes #297
1 parent 691de90 commit 978fd2e

File tree

7 files changed

+72
-18
lines changed

7 files changed

+72
-18
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ const chromeless = new Chromeless({
148148
- [`end()`](docs/api.md#api-end)
149149

150150
**Chrome methods**
151-
- [`goto(url: string)`](docs/api.md#api-goto)
151+
- [`goto(url: string, timeout?: number)`](docs/api.md#api-goto)
152152
- [`setUserAgent(useragent: string)`](docs/api.md#api-setUserAgent)
153153
- [`click(selector: string)`](docs/api.md#api-click)
154154
- [`wait(timeout: number)`](docs/api.md#api-wait-timeout)

docs/api.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Chromeless provides TypeScript typings.
1919
- [`end()`](#api-end)
2020

2121
### Chrome methods
22-
- [`goto(url: string)`](#api-goto)
22+
- [`goto(url: string, timeout?: number)`](#api-goto)
2323
- [`setUserAgent(useragent: string)`](#api-setuseragent)
2424
- [`click(selector: string)`](#api-click)
2525
- [`wait(timeout: number)`](#api-wait-timeout)
@@ -73,12 +73,13 @@ await chromeless.end()
7373

7474
<a name="api-goto" />
7575

76-
### goto(url: string): Chromeless<T>
76+
### goto(url: string, timeout?: number): Chromeless<T>
7777

7878
Navigate to a URL.
7979

8080
__Arguments__
8181
- `url` - URL to navigate to
82+
- `timeout` -How long to wait for page to load (default is value of waitTimeout option)
8283

8384
__Example__
8485

@@ -173,7 +174,7 @@ __Arguments__
173174
__Example__
174175

175176
```js
176-
await chromeless.wait(() => {
177+
await chromeless.wait(() => {
177178
return new Promise((resolve, reject) => {
178179
// do something async, setTimeout...
179180
resolve();

package-lock.json

Lines changed: 18 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ export default class Chromeless<T extends any> implements Promise<T> {
7373
return this.lastReturnPromise.catch(onrejected) as Promise<U>
7474
}
7575

76-
goto(url: string): Chromeless<T> {
77-
this.queue.enqueue({ type: 'goto', url })
76+
goto(url: string, timeout?: number): Chromeless<T> {
77+
this.queue.enqueue({ type: 'goto', url, timeout })
7878

7979
return this
8080
}

src/chrome/local-runtime.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import {
4040
writeToFile,
4141
isS3Configured,
4242
uploadToS3,
43+
eventToPromise,
44+
waitForPromise,
4345
} from '../util'
4446

4547
export default class LocalRuntime {
@@ -55,7 +57,7 @@ export default class LocalRuntime {
5557
async run(command: Command): Promise<any> {
5658
switch (command.type) {
5759
case 'goto':
58-
return this.goto(command.url)
60+
return this.goto(command.url, command.timeout)
5961
case 'setViewport':
6062
return setViewport(this.client, command.options)
6163
case 'wait': {
@@ -126,13 +128,18 @@ export default class LocalRuntime {
126128
}
127129
}
128130

129-
private async goto(url: string): Promise<void> {
131+
private async goto(
132+
url: string,
133+
waitTimeout: number = this.chromelessOptions.waitTimeout,
134+
): Promise<void> {
130135
const { Network, Page } = this.client
131136
await Promise.all([Network.enable(), Page.enable()])
132137
if (!this.userAgentValue) this.userAgentValue = `Chromeless ${version}`
133138
await Network.setUserAgentOverride({ userAgent: this.userAgentValue })
139+
const e2p = eventToPromise()
140+
Page.loadEventFired(e2p.onEvent)
134141
await Page.navigate({ url })
135-
await Page.loadEventFired()
142+
await waitForPromise(e2p.fired(), waitTimeout, 'page load event')
136143
this.log(`Navigated to ${url}`)
137144
}
138145

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export type Command =
6464
| {
6565
type: 'goto'
6666
url: string
67+
timeout?: number
6768
}
6869
| {
6970
type: 'clearCache'

src/util.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,42 @@ export async function wait(timeout: number): Promise<void> {
106106
return new Promise<void>((resolve, reject) => setTimeout(resolve, timeout))
107107
}
108108

109+
export async function waitForPromise<T>(
110+
promise: Promise<T>,
111+
waitTimeout: number,
112+
label?: string,
113+
): Promise<T> {
114+
return new Promise<T>((resolve, reject) => {
115+
let fullfilled = false
116+
setTimeout(() => {
117+
fullfilled = true
118+
reject(
119+
new Error(
120+
`wait(${label || 'Promise'}) timed out after ${waitTimeout}ms`,
121+
),
122+
)
123+
}, waitTimeout)
124+
return promise
125+
.then(res => (fullfilled ? void 0 : resolve(res)))
126+
.catch(err => (fullfilled ? void 0 : reject(err)))
127+
})
128+
}
129+
130+
export function eventToPromise() {
131+
let resolve
132+
const promise = new Promise(res => {
133+
resolve = res
134+
})
135+
return {
136+
onEvent(...args) {
137+
resolve(args.length > 1 ? args : args[0])
138+
},
139+
fired() {
140+
return promise
141+
},
142+
}
143+
}
144+
109145
export async function nodeExists(
110146
client: Client,
111147
selector: string,

0 commit comments

Comments
 (0)