Skip to content

Commit 690541e

Browse files
authored
Mock api response (#30)
* Init mock response keyword * Add mock response
1 parent 21c4e83 commit 690541e

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed

Examples/request-api-demo.robot

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
*** Settings ***
2+
Library Dialogs
3+
Library PuppeteerLibrary
4+
Test Setup Open browser to test page
5+
Test Teardown Close Browser
6+
7+
8+
*** Variables ***
9+
${HOME_PAGE_URL} http://127.0.0.1:7272
10+
11+
12+
*** Test Cases ***
13+
Mock response for api request
14+
&{response} Create Dictionary body=I'm a mock response
15+
Mock Current Page Api Response /ajax_info.json\\?count=3 ${response}
16+
Click Element id=get_ajax
17+
Wait Until Page Contains I'm a mock response
18+
19+
Mock response with json response
20+
&{response} Create Dictionary body={ 'data': 'I\'m a mock response'} contentType=application/json
21+
Mock Current Page Api Response /ajax_info.json\\?count=3 ${response}
22+
Click Element id=get_ajax
23+
Wait Until Page Contains I'm a mock response
24+
25+
*** Keywords ***
26+
Open browser to test page
27+
${HEADLESS} Get variable value ${HEADLESS} ${False}
28+
&{options} = create dictionary headless=${HEADLESS}
29+
Open browser ${HOME_PAGE_URL} options=${options}

PuppeteerLibrary/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
FormElementKeywordsAsync,
1717
JavascriptKeywords,
1818
JavascriptKeywordsAsync,
19+
MockResponseKeywords,
20+
MockResponseKeywordsAsync,
1921
ScreenshotKeywords,
2022
ScreenshotKeywordsAsync,
2123
UtilityKeywords,
2224
WaitingKeywords,
2325
WaitingKeywordsAsync)
2426

27+
2528
# Get the version from the _version.py versioneer file. For a git checkout,
2629
# this is computed based on the number of commits since the last tag.
2730
from ._version import get_versions
@@ -92,6 +95,7 @@ def __init__(self):
9295
ElementKeywords(self),
9396
FormElementKeywords(self),
9497
JavascriptKeywords(self),
98+
MockResponseKeywords(self),
9599
ScreenshotKeywords(self),
96100
UtilityKeywords(self),
97101
WaitingKeywords(self)
@@ -104,6 +108,7 @@ def __init__(self):
104108
ElementKeywordsAsync(self),
105109
FormElementKeywordsAsync(self),
106110
JavascriptKeywordsAsync(self),
111+
MockResponseKeywordsAsync(self),
107112
ScreenshotKeywordsAsync(self),
108113
WaitingKeywordsAsync(self)
109114
]

PuppeteerLibrary/keywords/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from .formelement_async import FormElementKeywordsAsync
99
from .javascript import JavascriptKeywords
1010
from .javascript_async import JavascriptKeywordsAsync
11+
from .mockresponse import MockResponseKeywords
12+
from .mockresponse_async import MockResponseKeywordsAsync
1113
from .screenshot import ScreenshotKeywords
1214
from .screenshot_async import ScreenshotKeywordsAsync
1315
from .utility import UtilityKeywords
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from PuppeteerLibrary.base.robotlibcore import keyword
2+
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
3+
from PuppeteerLibrary.keywords.mockresponse_async import MockResponseKeywordsAsync
4+
5+
6+
class MockResponseKeywords(LibraryComponent):
7+
8+
def __init__(self, ctx):
9+
super().__init__(ctx)
10+
self.async_func = MockResponseKeywordsAsync(self.ctx)
11+
12+
@keyword
13+
def mock_current_page_api_response(self, url, mock_response, method='GET', body=None):
14+
"""
15+
Mock current page api response.
16+
17+
The ``mock_response`` is a dictionary which can have the following fields:
18+
- ``status`` (int): Response status code, defaults to 200.
19+
- ``headers`` (dict): Optional response headers.
20+
- ``contentType`` (str): If set, equals to setting ``Content-Type`` response header.
21+
- ``body`` (str|bytes): Optional response body.
22+
23+
The ``url`` is request url. url can be partial url match using regexp
24+
Match Options:
25+
26+
| Options | Url value |
27+
| Exact match | ^http://127.0.0.1:7272/ajax_info.json\\?count=3$ |
28+
| Partial match | /ajax_info.json\\?count=3 |
29+
| Regular expression | .*?/ajax_info.json\\?count=3 |
30+
31+
The ``method`` is HTTP Request Methods:
32+
- GET (default)
33+
- POST
34+
- PUT
35+
- HEAD
36+
- DELETE
37+
- PATCH
38+
39+
The ``body`` is request body message. body can match using regexp
40+
41+
Example:
42+
43+
| &{response} | Create Dictionary | body=I'm a mock response |
44+
| Mock Current Page Api Response | /ajax_info.json\\?count=3 | ${response} |
45+
46+
"""
47+
return self.loop.run_until_complete(self.async_func.mock_current_page_api_response_async(url, mock_response, method, body))
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import asyncio
2+
import re
3+
from pyppeteer.network_manager import Request
4+
from PuppeteerLibrary.base.robotlibcore import keyword
5+
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
6+
7+
8+
class MockResponseKeywordsAsync(LibraryComponent):
9+
10+
def __init__(self, ctx):
11+
self.ctx = ctx
12+
13+
@keyword
14+
async def mock_current_page_api_response_async(self, url, mock_response, method='GET', body=None):
15+
page = self.ctx.get_current_page()
16+
await page.setRequestInterception(True)
17+
page.on('request', lambda request:
18+
asyncio.ensure_future(self.mock_api_response(request, url, mock_response, method, body)))
19+
20+
async def mock_api_response(self, request: Request, url, mock_response, method, body):
21+
if re.search(url, request.url) is not None and request.method == method:
22+
try:
23+
pos_data = (await request.postData())
24+
except:
25+
pos_data = ''
26+
if body is None or re.search(body, pos_data.replace('\n', '')):
27+
return await request.respond(mock_response)
28+
await request.continue_()
29+

0 commit comments

Comments
 (0)