Skip to content

Commit cf24b7d

Browse files
authored
Enhance return http data for wait for request & response keywords (#45)
- Enhance return result for wait for request and response keywords - Enhance Run Async Keywords support return result value - Hot fixed wait for new page crash during call .title() function
1 parent 34091ff commit cf24b7d

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

Examples/wait-for-demo.robot

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,23 @@ Demo wait for http request
1818
${HEADLESS} Get variable value ${HEADLESS} ${False}
1919
&{options} = create dictionary headless=${HEADLESS}
2020
Open browser ${HOME_PAGE_URL} options=${options}
21-
Run Async Keywords
22-
... Click Element id:get_ajax AND
23-
... Wait for request url /ajax_info.json
21+
${results} = Run Async Keywords
22+
... Wait for request url /ajax_info.json AND
23+
... Click Element id:get_ajax
24+
Should Contain ${results[0].url} ajax
25+
Should Be Equal As Strings ${results[0].method} GET
26+
Log ${results[0].body}
2427

2528
Demo wait for http response
2629
${HEADLESS} Get variable value ${HEADLESS} ${False}
2730
&{options} = create dictionary headless=${HEADLESS}
2831
Open browser ${HOME_PAGE_URL} options=${options}
29-
Run Async Keywords
30-
... Click Element id:get_ajax AND
31-
... Wait for response url /ajax_info.json\\?count=3 200 name.*?p1.*?name.*?p2.*?name.*?p3
32+
${results} = Run Async Keywords
33+
... Wait for response url /ajax_info.json\\?count=3 200 name.*?p1.*?name.*?p2.*?name.*?p3 AND
34+
... Click Element id:get_ajax
35+
Should Contain ${results[0].url} ajax
36+
Should Be Equal As Strings ${results[0].status} 200
37+
Log ${results[0].body}
3238

3339
Demo wait for navigation
3440
${HEADLESS} Get variable value ${HEADLESS} ${False}

PuppeteerLibrary/keywords/browsermanagement_async.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import time
23
from PuppeteerLibrary.base.robotlibcore import keyword
34
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
@@ -11,7 +12,10 @@ async def get_window_count_async(self):
1112
pages = await self.ctx.get_browser().pages()
1213
for page in pages:
1314
# Workaround: for force pages re-cache
14-
await page.title()
15+
try:
16+
await page.title()
17+
except:
18+
return -1
1519
return len(await self.ctx.get_browser().pages())
1620

1721
@keyword
@@ -22,13 +26,12 @@ async def wait_for_new_window_open_async(self, timeout=None):
2226
# Page length still not update / same as before open new window
2327
pre_page_len = len(await self.ctx.get_browser().pages())
2428
timeout = self.timestr_to_secs_for_default_timeout(timeout)
25-
timer = 0
26-
while timer < timeout:
29+
max_time = time.time() + timeout
30+
while time.time() < max_time:
2731
page_len = await self.get_window_count_async()
2832
if page_len > pre_page_len:
2933
return
30-
timer += 1
31-
time.sleep(1)
34+
await asyncio.sleep(0.5)
3235
raise Exception('No new page has been open. pre: ' + str(pre_page_len) + ' current: ' + str(page_len))
3336

3437
@keyword

PuppeteerLibrary/keywords/utility.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ def run_async_keywords(self, *keywords):
1111
# Ensure that script load async keywords before run async keywords function
1212
"""Executes all the given keywords in a asynchronous and wait until all keyword is completed
1313
14+
``Return`` Array of return for reach keywords based on index
15+
1416
Example:
1517
1618
| Open browser | ${HOME_PAGE_URL} | options=${options} | |
@@ -20,14 +22,13 @@ def run_async_keywords(self, *keywords):
2022
"""
2123
self.ctx.load_async_keywords()
2224
run_keyword = _RunKeyword()
23-
self.loop.run_until_complete( self._run_async_keywords(run_keyword._split_run_keywords(list(keywords))) )
25+
return self.loop.run_until_complete( self._run_async_keywords(run_keyword._split_run_keywords(list(keywords))) )
2426

2527
async def _run_async_keywords(self, iterable):
2628
statements = []
2729
for kw, args in iterable:
2830
kw_name = kw.lower().replace(' ', '_') + '_async'
2931
statements.append(self.ctx.keywords[kw_name](*args))
30-
3132
try:
3233
return await asyncio.gather(*statements)
3334
except Exception as err:

PuppeteerLibrary/keywords/waiting.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ def wait_for_request_url(self, url, method='GET', body=None, timeout=None):
3232
3333
The ``body`` is request body message. body can match using regexp
3434
35+
``Return`` request msg with properties {url, method, body}
36+
3537
Example:
3638
3739
| Open browser | ${HOME_PAGE_URL} | options=${options} | | |
@@ -60,6 +62,8 @@ def wait_for_response_url(self, url, status=200, body=None, timeout=None):
6062
- 500
6163
Reference:[https://restfulapi.net/http-status-codes/|https://restfulapi.net/http-status-codes/]
6264
65+
``Return`` request msg with properties {url, status, body}
66+
6367
Example:
6468
6569
| Open browser | ${HOME_PAGE_URL} | options=${options} | | |

PuppeteerLibrary/keywords/waiting_async.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
22
import time
33
import re
4+
from robot.utils import DotDict
45
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
56
from PuppeteerLibrary.base.robotlibcore import keyword
67

@@ -15,10 +16,12 @@ async def wait_for_request_url_async(self, url, method='GET', body=None, timeout
1516
, options={
1617
'timeout': self.timestr_to_secs_for_default_timeout(timeout) * 1000
1718
})
19+
1820
try:
1921
pos_data = (await req.postData())
2022
except:
2123
pos_data = ''
24+
2225
if body is None or re.search(body, pos_data.replace('\n', '')):
2326
log_str = 'Wait for request url: '+req.method+' - '+req.url
2427
if pos_data != '':
@@ -27,6 +30,12 @@ async def wait_for_request_url_async(self, url, method='GET', body=None, timeout
2730
else:
2831
raise Exception('Can\'t match request body with ' + body + ' \n ' + pos_data)
2932

33+
return DotDict({
34+
'url': req.url,
35+
'method': req.method,
36+
'body': pos_data
37+
})
38+
3039
@keyword
3140
async def wait_for_response_url_async(self, url, status=200, body=None, timeout=None):
3241
res = await self.ctx.get_current_page().waitForResponse(
@@ -46,6 +55,11 @@ async def wait_for_response_url_async(self, url, status=200, body=None, timeout=
4655
self.info(log_str)
4756
else:
4857
raise Exception('Can\'t match response body with '+body+' \n '+res_text)
58+
return DotDict({
59+
'url': res.url,
60+
'status': res.status,
61+
'body': res_text
62+
})
4963

5064
@keyword
5165
async def wait_for_navigation_async(self, timeout=None):

0 commit comments

Comments
 (0)