mirror of
https://github.com/dgtlmoon/changedetection.io.git
synced 2025-12-12 11:05:42 +00:00
@@ -84,7 +84,9 @@ def construct_blueprint(datastore: ChangeDetectionStore):
|
|||||||
# Tell Playwright to connect to Chrome and setup a new session via our stepper interface
|
# Tell Playwright to connect to Chrome and setup a new session via our stepper interface
|
||||||
browsersteps_start_session['browserstepper'] = browser_steps.browsersteps_live_ui(
|
browsersteps_start_session['browserstepper'] = browser_steps.browsersteps_live_ui(
|
||||||
playwright_browser=browsersteps_start_session['browser'],
|
playwright_browser=browsersteps_start_session['browser'],
|
||||||
proxy=proxy)
|
proxy=proxy,
|
||||||
|
start_url=datastore.data['watching'][watch_uuid].get('url')
|
||||||
|
)
|
||||||
|
|
||||||
# For test
|
# For test
|
||||||
#browsersteps_start_session['browserstepper'].action_goto_url(value="http://example.com?time="+str(time.time()))
|
#browsersteps_start_session['browserstepper'].action_goto_url(value="http://example.com?time="+str(time.time()))
|
||||||
@@ -167,11 +169,6 @@ def construct_blueprint(datastore: ChangeDetectionStore):
|
|||||||
step_n = int(request.form.get('step_n'))
|
step_n = int(request.form.get('step_n'))
|
||||||
is_last_step = strtobool(request.form.get('is_last_step'))
|
is_last_step = strtobool(request.form.get('is_last_step'))
|
||||||
|
|
||||||
if step_operation == 'Goto site':
|
|
||||||
step_operation = 'goto_url'
|
|
||||||
step_optional_value = datastore.data['watching'][uuid].get('url')
|
|
||||||
step_selector = None
|
|
||||||
|
|
||||||
# @todo try.. accept.. nice errors not popups..
|
# @todo try.. accept.. nice errors not popups..
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ browser_step_ui_config = {'Choose one': '0 0',
|
|||||||
# ONLY Works in Playwright because we need the fullscreen screenshot
|
# ONLY Works in Playwright because we need the fullscreen screenshot
|
||||||
class steppable_browser_interface():
|
class steppable_browser_interface():
|
||||||
page = None
|
page = None
|
||||||
|
start_url = None
|
||||||
|
|
||||||
|
def __init__(self, start_url):
|
||||||
|
self.start_url = start_url
|
||||||
|
|
||||||
# Convert and perform "Click Button" for example
|
# Convert and perform "Click Button" for example
|
||||||
def call_action(self, action_name, selector=None, optional_value=None):
|
def call_action(self, action_name, selector=None, optional_value=None):
|
||||||
@@ -87,6 +91,10 @@ class steppable_browser_interface():
|
|||||||
logger.debug(f"Time to goto URL {time.time()-now:.2f}s")
|
logger.debug(f"Time to goto URL {time.time()-now:.2f}s")
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
# Incase they request to go back to the start
|
||||||
|
def action_goto_site(self, selector=None, value=None):
|
||||||
|
return self.action_goto_url(value=self.start_url)
|
||||||
|
|
||||||
def action_click_element_containing_text(self, selector=None, value=''):
|
def action_click_element_containing_text(self, selector=None, value=''):
|
||||||
if not len(value.strip()):
|
if not len(value.strip()):
|
||||||
return
|
return
|
||||||
@@ -194,10 +202,11 @@ class browsersteps_live_ui(steppable_browser_interface):
|
|||||||
|
|
||||||
browser_type = os.getenv("PLAYWRIGHT_BROWSER_TYPE", 'chromium').strip('"')
|
browser_type = os.getenv("PLAYWRIGHT_BROWSER_TYPE", 'chromium').strip('"')
|
||||||
|
|
||||||
def __init__(self, playwright_browser, proxy=None, headers=None):
|
def __init__(self, playwright_browser, proxy=None, headers=None, start_url=None):
|
||||||
self.headers = headers or {}
|
self.headers = headers or {}
|
||||||
self.age_start = time.time()
|
self.age_start = time.time()
|
||||||
self.playwright_browser = playwright_browser
|
self.playwright_browser = playwright_browser
|
||||||
|
self.start_url = start_url
|
||||||
if self.context is None:
|
if self.context is None:
|
||||||
self.connect(proxy=proxy)
|
self.connect(proxy=proxy)
|
||||||
|
|
||||||
|
|||||||
@@ -112,23 +112,26 @@ class Fetcher():
|
|||||||
|
|
||||||
def browser_steps_get_valid_steps(self):
|
def browser_steps_get_valid_steps(self):
|
||||||
if self.browser_steps is not None and len(self.browser_steps):
|
if self.browser_steps is not None and len(self.browser_steps):
|
||||||
valid_steps = filter(
|
valid_steps = list(filter(
|
||||||
lambda s: (s['operation'] and len(s['operation']) and s['operation'] != 'Choose one' and s['operation'] != 'Goto site'),
|
lambda s: (s['operation'] and len(s['operation']) and s['operation'] != 'Choose one'),
|
||||||
self.browser_steps)
|
self.browser_steps))
|
||||||
|
|
||||||
|
# Just incase they selected Goto site by accident with older JS
|
||||||
|
if valid_steps and valid_steps[0]['operation'] == 'Goto site':
|
||||||
|
del(valid_steps[0])
|
||||||
|
|
||||||
return valid_steps
|
return valid_steps
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def iterate_browser_steps(self):
|
def iterate_browser_steps(self, start_url=None):
|
||||||
from changedetectionio.blueprint.browser_steps.browser_steps import steppable_browser_interface
|
from changedetectionio.blueprint.browser_steps.browser_steps import steppable_browser_interface
|
||||||
from playwright._impl._errors import TimeoutError, Error
|
from playwright._impl._errors import TimeoutError, Error
|
||||||
from changedetectionio.safe_jinja import render as jinja_render
|
from changedetectionio.safe_jinja import render as jinja_render
|
||||||
|
|
||||||
step_n = 0
|
step_n = 0
|
||||||
|
|
||||||
if self.browser_steps is not None and len(self.browser_steps):
|
if self.browser_steps is not None and len(self.browser_steps):
|
||||||
interface = steppable_browser_interface()
|
interface = steppable_browser_interface(start_url=start_url)
|
||||||
interface.page = self.page
|
interface.page = self.page
|
||||||
valid_steps = self.browser_steps_get_valid_steps()
|
valid_steps = self.browser_steps_get_valid_steps()
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ class fetcher(Fetcher):
|
|||||||
|
|
||||||
# Re-use as much code from browser steps as possible so its the same
|
# Re-use as much code from browser steps as possible so its the same
|
||||||
from changedetectionio.blueprint.browser_steps.browser_steps import steppable_browser_interface
|
from changedetectionio.blueprint.browser_steps.browser_steps import steppable_browser_interface
|
||||||
browsersteps_interface = steppable_browser_interface()
|
browsersteps_interface = steppable_browser_interface(start_url=url)
|
||||||
browsersteps_interface.page = self.page
|
browsersteps_interface.page = self.page
|
||||||
|
|
||||||
response = browsersteps_interface.action_goto_url(value=url)
|
response = browsersteps_interface.action_goto_url(value=url)
|
||||||
@@ -172,7 +172,7 @@ class fetcher(Fetcher):
|
|||||||
|
|
||||||
# Run Browser Steps here
|
# Run Browser Steps here
|
||||||
if self.browser_steps_get_valid_steps():
|
if self.browser_steps_get_valid_steps():
|
||||||
self.iterate_browser_steps()
|
self.iterate_browser_steps(start_url=url)
|
||||||
|
|
||||||
self.page.wait_for_timeout(extra_wait * 1000)
|
self.page.wait_for_timeout(extra_wait * 1000)
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ $(document).ready(function () {
|
|||||||
set_scale();
|
set_scale();
|
||||||
});
|
});
|
||||||
// Should always be disabled
|
// Should always be disabled
|
||||||
$('#browser_steps >li:first-child select').val('Goto site').attr('disabled', 'disabled');
|
$('#browser_steps-0-operation option[value="Goto site"]').prop("selected", "selected");
|
||||||
|
$('#browser_steps-0-operation').attr('disabled', 'disabled');
|
||||||
|
|
||||||
$('#browsersteps-click-start').click(function () {
|
$('#browsersteps-click-start').click(function () {
|
||||||
$("#browsersteps-click-start").fadeOut();
|
$("#browsersteps-click-start").fadeOut();
|
||||||
|
|||||||
@@ -102,10 +102,9 @@ def test_basic_browserstep(client, live_server):
|
|||||||
"url": test_url,
|
"url": test_url,
|
||||||
"tags": "",
|
"tags": "",
|
||||||
'fetch_backend': "html_webdriver",
|
'fetch_backend': "html_webdriver",
|
||||||
'browser_steps-0-operation': 'Goto site',
|
'browser_steps-0-operation': 'Click element',
|
||||||
'browser_steps-1-operation': 'Click element',
|
'browser_steps-0-selector': 'button[name=test-button]',
|
||||||
'browser_steps-1-selector': 'button[name=test-button]',
|
'browser_steps-0-optional_value': '',
|
||||||
'browser_steps-1-optional_value': '',
|
|
||||||
# For now, cookies doesnt work in headers because it must be a full cookiejar object
|
# For now, cookies doesnt work in headers because it must be a full cookiejar object
|
||||||
'headers': "testheader: yes\buser-agent: MyCustomAgent",
|
'headers': "testheader: yes\buser-agent: MyCustomAgent",
|
||||||
},
|
},
|
||||||
@@ -141,10 +140,9 @@ def test_basic_browserstep(client, live_server):
|
|||||||
"url": four_o_four_url,
|
"url": four_o_four_url,
|
||||||
"tags": "",
|
"tags": "",
|
||||||
'fetch_backend': "html_webdriver",
|
'fetch_backend': "html_webdriver",
|
||||||
'browser_steps-0-operation': 'Goto site',
|
'browser_steps-0-operation': 'Click element',
|
||||||
'browser_steps-1-operation': 'Click element',
|
'browser_steps-0-selector': 'button[name=test-button]',
|
||||||
'browser_steps-1-selector': 'button[name=test-button]',
|
'browser_steps-0-optional_value': ''
|
||||||
'browser_steps-1-optional_value': ''
|
|
||||||
},
|
},
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user