class test_API_Browser(TestCase): def setUp(self): self.api = API_Browser(headless=False) #@unittest.skip("bug: needs to load markdow page first") @sync async def test_js_eval(self): text = "some_text" text_base64 = base64.b64encode(text.encode()).decode() assert await self.api.js_eval("btoa('{0}')".format(text) ) == text_base64 assert await self.api.js_eval("atob('{0}')".format(text_base64) ) == text @sync async def test_html(self): await self.api.open('https://www.google.com') html = await self.api.html() assert len(html) > 100 @sync async def test_open(self): (headers, status, url, browser) = await self.api.open('https://www.google.com') assert headers['x-frame-options'] == 'SAMEORIGIN' assert status == 200 assert url == 'https://www.google.com/' @sync async def test_page(self): url = 'https://www.google.com/404' await self.api.open(url) page = await self.api.page() assert page.url == url @sync async def test_screenshot(self): await self.api.open('https://news.bbc.co.uk') file_jpg = await self.api.screenshot() assert Files.exists(file_jpg) #exec_open(file_jpg) @sync @pytest.mark.skip("needs to run in Headless mode") async def test_pdf(self): # note: only works when headless = True . See https://github.com/puppeteer/puppeteer/issues/1829#issuecomment-657930419 await self.api.open('https://news.bbc.co.uk') file_pdf = await self.api.pdf() assert Files.exists(file_pdf) exec_open(file_pdf) def test_open_settings(self): page = 'chrome://settings/help' self.api.sync__open(page)
class Temp_Browser: api_browser: API_Browser browser: Chrome def __init__(self, headless=True, auto_close=True, open_page=None): self.headless = headless self.auto_close = auto_close self.open_page = open_page self.temp_screenshot_file = '/tmp/temp_browser_screenshot.png' def __enter__(self): self.api_browser = API_Browser(headless=self.headless) self.browser = self.api_browser.sync__browser() if self.open_page: self.api_browser.sync__open(self.open_page) return self def __exit__(self, exc_type, exc_val, exc_tb): if self.auto_close is True: self.api_browser.sync__close_browser( ) # todo see if this really only continues when the process process has terminated def links(self): return self.py_query().query('a').indexed_by_attribute( 'href', return_unique_list=True) def screenshot(self, save_to=None): if save_to is None: save_to = self.temp_screenshot_file return self.api_browser.sync__screenshot(file_screenshot=save_to) def html(self): return self.api_browser.sync__html_raw() def open(self, url): return self.api_browser.sync__open(url) def open_google(self): return self.open('https://www.google.com') def page(self): return self.api_browser.sync__page() def url(self): return self.api_browser.sync__url() def py_query(self): return Py_Query(self.html()) def set_auto_close(self, value): self.auto_close = value
def run(event, context=None): load_dependencies('syncer,requests,pyppeteer2,websocket-client') from osbot_browser.browser.API_Browser import API_Browser url = event.get('url') #return url # error in this line: Read-only file system: '/home/sbx_user1051 api_browser = API_Browser().sync__setup_browser() # we don't get here if url: api_browser.sync__open(url) return api_browser.sync__screenshot_base64()
class test_workflows_API_Browser(TestCase): def setUp(self): self.api = API_Browser(headless=False) self.png_file = '/tmp/tmp-jira-screenshot.png' def test_open_jira_slack(self): #url = 'https://os-summit.slack.com/messages/DJ8UA0RFT/' url = 'https://os-summit.slack.com/messages/CK475UCJY/' self.api.sync__open(url) email = '*****@*****.**' password = "******" js_code = """$('#email').val('{0}') $('#password').val('{1}') $('#signin_btn').click() """.format(email, password) self.api.sync__js_execute(js_code) #await self.api.screenshot(file_screenshot=self.png_file) @sync async def test_open_jira_page(self): from osbot_aws.apis.Secrets import Secrets self.api = API_Browser(headless=False) login_needed = False self.secrets_id = 'GS_BOT_GS_JIRA' (server, username, password) = Secrets( self.secrets_id).value_from_json_string().values() if login_needed: Dev.pprint(server, username, password) await self.api.open(server + '/login.jsp') page = await self.api.page() await page.type('#login-form-username', username) await page.type('#login-form-password', password) await page.click('#login-form-submit') #await self.api.open(server + '/browse/GSP-95') #page = await self.api.page() #await self.api.js_execute("$('#show-more-links-link').click()") #from time import sleep #sleep(1) await self.api.page_size(2000, 3000) await self.api.screenshot( file_screenshot='/tmp/tmp-jira-screenshot.png', full_page=True)