diff --git a/.gitignore b/.gitignore index 30820e6..56a4245 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ report.html /Examples/*.png *.pdf Examples/logs/ +Examples/tmp-download/test.csv +Examples;tmp-download/test.csv diff --git a/Examples/form-handler/download-file.robot b/Examples/form-handler/download-file.robot index aa27bb8..f991fb8 100644 --- a/Examples/form-handler/download-file.robot +++ b/Examples/form-handler/download-file.robot @@ -1,19 +1,24 @@ *** Settings *** +Library OperatingSystem Library PuppeteerLibrary Test Setup Open browser to test page Test Teardown Close All Browser Suite Teardown Close Puppeteer *** Variables *** -${DEFAULT_BROWSER} webkit +${DEFAULT_BROWSER} chrome ${HOME_PAGE_URL} http://127.0.0.1:7272/basic-html-elements.html *** Test Cases *** -Download file - [Tags] Ignore_chrome +Download file ${file path} = Download File id=download-file Should Not Be Empty ${file path} Download file failed + Get File ${file path} + +Upload file + ${file} = OperatingSystem.Join Path ${CURDIR} iframe.robot + Upload File id=fileToUpload ${file} *** Keywords *** Open browser to test page diff --git a/Examples/form-handler/element-properties.robot b/Examples/form-handler/element-properties.robot index e648226..e9e2c9b 100644 --- a/Examples/form-handler/element-properties.robot +++ b/Examples/form-handler/element-properties.robot @@ -12,7 +12,7 @@ ${HOME_PAGE_URL} http://127.0.0.1:7272/basic-html-elements.html *** Test Cases *** Count element ${No of h2} = Get Element Count css=h2 - Should Be Equal As Numbers 13 ${No of h2} + Should Be Equal As Numbers 14 ${No of h2} Get element attribute ${type value} = Get Element Attribute id=alert_confirm type diff --git a/PuppeteerLibrary/ikeywords/iformelement_async.py b/PuppeteerLibrary/ikeywords/iformelement_async.py index 38a5aa7..dd7bcb7 100644 --- a/PuppeteerLibrary/ikeywords/iformelement_async.py +++ b/PuppeteerLibrary/ikeywords/iformelement_async.py @@ -13,5 +13,9 @@ async def clear_element_text(self, locator: str): pass @abstractmethod - async def download_file(self, locator: str): + async def download_file(self, locator: str, timeout=None): + pass + + @abstractmethod + async def upload_file(self, locator: str, file_path: str): pass diff --git a/PuppeteerLibrary/keywords/formelement.py b/PuppeteerLibrary/keywords/formelement.py index b35dc7f..02894a6 100644 --- a/PuppeteerLibrary/keywords/formelement.py +++ b/PuppeteerLibrary/keywords/formelement.py @@ -38,5 +38,9 @@ def clear_element_text(self, locator): self.loop.run_until_complete(self.get_async_keyword_group().clear_element_text(locator)) @keyword - def download_file(self, locator): - return self.loop.run_until_complete(self.get_async_keyword_group().download_file(locator)) + def download_file(self, locator, timeout=None): + return self.loop.run_until_complete(self.get_async_keyword_group().download_file(locator, timeout)) + + @keyword + def upload_file(self, locator, file_path): + return self.loop.run_until_complete(self.get_async_keyword_group().upload_file(locator, file_path)) diff --git a/PuppeteerLibrary/playwright/async_keywords/playwright_formelement.py b/PuppeteerLibrary/playwright/async_keywords/playwright_formelement.py index f3de509..411f8b0 100644 --- a/PuppeteerLibrary/playwright/async_keywords/playwright_formelement.py +++ b/PuppeteerLibrary/playwright/async_keywords/playwright_formelement.py @@ -16,12 +16,17 @@ async def input_text(self, locator: str, text: str, clear=True): async def clear_element_text(self, locator: str): await self._clear_input_text(locator) - async def download_file(self, locator: str): + async def download_file(self, locator: str, timeout=None): + timeout = self.timestr_to_secs_for_default_timeout(timeout)* 1000 page = self.library_ctx.get_current_page().get_page() - tasks = self.library_ctx.get_current_page().click_with_selenium_locator(locator), page.waitForEvent('download') + tasks = self.library_ctx.get_current_page().click_with_selenium_locator(locator), page.waitForEvent('download', timeout=timeout) _, b = await asyncio.gather(*tasks) return await b.path() + async def upload_file(self, locator: str, file_path: str): + handle = await self.library_ctx.get_current_page().querySelector_with_selenium_locator(locator) + await handle.setInputFiles(file_path) + async def _clear_input_text(self, selenium_locator): await self.library_ctx.get_current_page().click_with_selenium_locator(selenium_locator, {'clickCount': 3}) await self.library_ctx.get_current_page().get_page().keyboard.press('Backspace') diff --git a/PuppeteerLibrary/puppeteer/async_keywords/puppeteer_formelement.py b/PuppeteerLibrary/puppeteer/async_keywords/puppeteer_formelement.py index 368e459..e601e48 100644 --- a/PuppeteerLibrary/puppeteer/async_keywords/puppeteer_formelement.py +++ b/PuppeteerLibrary/puppeteer/async_keywords/puppeteer_formelement.py @@ -1,3 +1,7 @@ +import os +import glob +import shutil +import time from PuppeteerLibrary.ikeywords.iformelement_async import iFormElementAsync @@ -14,9 +18,33 @@ async def input_text(self, locator: str, text: str, clear=True): async def clear_element_text(self, locator: str): await self._clear_input_text(locator) - async def download_file(self, locator: str): - raise Exception("Sorry, keyword: download_file not support.") - + async def download_file(self, locator: str, timeout=None): + path = os.getcwd()+''+os.sep+'tmp-download' + try: + shutil.rmtree(path) + except: + self.info('Cannot cleanup the tmp download folder.') + page = self.library_ctx.get_current_page().get_page() + await page._client.send('Page.setDownloadBehavior', { + 'behavior': 'allow', + 'downloadPath': path + }) + await self.library_ctx.get_current_page().click_with_selenium_locator(locator) + timeout = self.timestr_to_secs_for_default_timeout(timeout) + max_time = time.time() + timeout + file = None + while time.time() < max_time: + time.sleep(1) + files = glob.glob(path+''+os.sep+'*') + if len(files) == 1: + file = files[0] + break + return file + + async def upload_file(self, locator: str, file_path: str): + element = await self.library_ctx.get_current_page().querySelector_with_selenium_locator(locator) + return await element.uploadFile(file_path) + async def _clear_input_text(self, selenium_locator): await self.library_ctx.get_current_page().click_with_selenium_locator(selenium_locator, {'clickCount': 3}) await self.library_ctx.get_current_page().get_page().keyboard.press('Backspace') diff --git a/demoapp/html/basic-html-elements.html b/demoapp/html/basic-html-elements.html index 68c6f20..2ac4e84 100644 --- a/demoapp/html/basic-html-elements.html +++ b/demoapp/html/basic-html-elements.html @@ -322,6 +322,21 @@

Download file


+
+
+

Upload file

+
+
+
+ Select image to upload: +

+ +

+ +
+
+
+