@ -41,6 +41,20 @@ Using the **Browser Steps** configuration, add basic steps before performing cha
After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
Requires Playwright to be enabled.
Requires Playwright to be enabled.
### Awesome restock and price change notifications
Enable the _"Re-stock & Price detection for single product pages"_ option to activate the best way to monitor product pricing.
Easily organise and monitor prices for products from the dashboard, get alerts and notifications when the price of a product changes or comes back in stock again!
[<img src="docs/restock-overview.png" style="max-width:100%;" alt="Easily keep an eye on product price changes directly from the UI" title="Easily keep an eye on product price changes directly from the UI" />](https://changedetection.io?src=github)
Set price change notification parameters, upper and lower price, price change percentage and more.
Always know when a product for sale drops in price.
notification_body=TextAreaField('Notification Body',default='{{ watch_url }} had a change.',validators=[validators.Optional(),ValidateJinja2Template()])
notification_body=TextAreaField('Notification Body',default='{{ watch_url }} had a change.',validators=[validators.Optional(),ValidateJinja2Template()])
@ -429,8 +436,8 @@ class commonSettingsForm(Form):
processor=RadioField(label=u"Processor - What do you want to achieve?",choices=processors.available_processors(),default="text_json_diff")
processor=RadioField(label=u"Processor - What do you want to achieve?",choices=processors.available_processors(),default="text_json_diff")
webdriver_delay=IntegerField('Wait seconds before extracting text',validators=[validators.Optional(),validators.NumberRange(min=1,
webdriver_delay=IntegerField('Wait seconds before extracting text',validators=[validators.Optional(),validators.NumberRange(min=1,message="Should contain one or more seconds")])
message="Should contain one or more seconds")])
classimportForm(Form):
classimportForm(Form):
from.importprocessors
from.importprocessors
@ -590,6 +597,11 @@ class globalSettingsForm(Form):
# Define these as FormFields/"sub forms", this way it matches the JSON storage
# Define these as FormFields/"sub forms", this way it matches the JSON storage