Skip to content

Instantly share code, notes, and snippets.

@trflynn89
Last active February 7, 2025 17:17
Show Gist options
  • Save trflynn89/6510420054a22efc473adf3c75bd2311 to your computer and use it in GitHub Desktop.
Save trflynn89/6510420054a22efc473adf3c75bd2311 to your computer and use it in GitHub Desktop.
Serenity WebDriver
#!/usr/bin/env python3
# pip3 install pillow
# pip3 install requests
import base64
import io
import json
import requests
import time
from PIL import Image
WEBDRIVER_ADDRESS = 'http://localhost:8000'
CAPABILITIES = {
'capabilities': {
'alwaysMatch' : {
'timeouts': {
'implicit': 10000,
},
'ladybird:headless': False,
}
}
}
class WebDriver:
def __init__(self, address, capabilities):
self.address = address
self.capabilities = capabilities
self.session_id = None
def __enter__(self):
session_id = self.post('/session', payload=self.capabilities)
self.session_id = session_id['sessionId']
print(f'\x1b[1;34mBeginning session:\x1b[0m {self.session_id}\n')
return self
def __exit__(self, type, value, traceback):
print(f'\x1b[1;34mEnding session:\x1b[0m {self.session_id}\n')
self.delete('/session/{session_id}')
def get(self, path, payload=None, **kwargs):
return self._request(requests.get, path, payload, **kwargs)
def post(self, path, payload=None, **kwargs):
return self._request(requests.post, path, payload, **kwargs)
def delete(self, path, payload=None, **kwargs):
return self._request(requests.delete, path, payload, **kwargs)
def _request(self, method, path, payload, **kwargs):
path = path.format(session_id=self.session_id, **kwargs)
data = json.dumps(payload) if payload else None
payload_string = f': {json.dumps(payload)}' if payload else ''
print(f'\x1b[1;32m>>\x1b[0m {method.__name__.upper()} {path}{payload_string}')
response = method(self.address + path, data=data)
data = response.json()
if response.status_code != 200:
message = data['value']['message']
print(f'\x1b[1;31mWebDriverError:\x1b[0m {path}: {message}')
raise Exception(message)
if isinstance(data['value'], str) and (len(data['value']) > 256):
print(f'\x1b[1;32m<<\x1b[0m {len(data["value"])} bytes\n')
else:
print(f'\x1b[1;32m<<\x1b[0m {json.dumps(data["value"])}\n')
return data['value']
with WebDriver(WEBDRIVER_ADDRESS, CAPABILITIES) as driver:
driver.post('/session/{session_id}/url', {'url': 'https://serenityos.org/'})
element = driver.post('/session/{session_id}/element', {'using': 'css selector', 'value': 'img[src="banner2.png"]'})
element_id = element['element-6066-11e4-a52e-4f735466cecf']
screenshot = driver.get('/session/{session_id}/element/{element_id}/screenshot', element_id=element_id)
screenshot = base64.b64decode(screenshot)
with Image.open(io.BytesIO(screenshot)) as image:
image.show()
time.sleep(5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment