Goal: collect screenshots for each page of an Oracle APEX application in order to prepare a user documentation.
I considered a custom developement for automating screenshots but I realized that it was not trivial and I had a look to an online service instead. There are plenty of these kinds of service and I tested the following subset, considering only ones providing a rest API:
On line service | Basic Plan | Evaluation | Drawbacks |
pikwy | 3€/month + 0,003/snapshot | Very good | ok with apex.oracle.com but Impossible to access a free tier instance (timeout). Possible to access protected pages. |
apiflash | Free with a limit of 100 snapshots/month (upgrade at 7€/month) | Very good | not possible to access protected pages |
screenshotmachine | Free with a limit of 100 screenshots/month (upgrade at 9€/month) | Very good | not possible to access protected pages |
site-shot | 5€/mont for 2000 snapshots | Very good | not possible to access protected pages |
url2png | 29€/month for 5000 screenshots | not tested | |
getscreenshotapi | 5€Month for 2500 screenshots | not tested |
Finally, I realized my prototype with apiflash and I choosed the « Sample Cards » application as a demo case.
It’s just a matter of calling the screenshot API for each page (https://api.apiflash.com/v1/urltoimage) and put the result in a companion able (DEMO_BLOB). cf procedure code after and a sample display app.
Important: The API doesn’t deals with authentication, so I set a new scheme at « No authentication », for the duration of the test, at least, then I switch back to the regular auth scheme. Pickwy allows providing credentials, but suffers a specific anomaly in may case (cf above)
Limitations: the modal pages can’t be managed this way, except if API gives opportunity to send keystrokes before, or navigating possibilities.
Sample procedure
procedure buildscreens (pid number) is turl varchar2(2000) := 'https://api.apiflash.com/v1/urltoimage?access_key= <ACCESS_KEY>&url=<APEX_ENCODED_URL>'; l_blob BLOB; tbody CLOB; target varchar2(2000); begin for c in (select page_alias, page_name from APEX_APPLICATION_PAGES where application_id=pid and PAGE_ALIAS IS NOT NULL ) loop target := turl || lower(c.PAGE_ALIAS); l_blob := APEX_WEB_SERVICE.make_rest_request_b( p_url => target , p_http_method => 'GET' ); insert into demo_blob(image, page_name) values (l_blob, c.page_name); commit; if apex_web_service.g_status_code = 404 then null; -- return '1'; end if; end loop; end;