From 0758a586ae4afd0dd454eacd2884adee80ce5490 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 13 Apr 2020 03:57:18 -0400 Subject: [PATCH 1/9] Add the Brython integration --- integrations/brython/ReadMe.md | 21 ++++ integrations/brython/index.html | 44 +++++++ integrations/brython/index.py | 5 + integrations/brython/library.html | 203 ++++++++++++++++++++++++++++++ 4 files changed, 273 insertions(+) create mode 100755 integrations/brython/ReadMe.md create mode 100644 integrations/brython/index.html create mode 100644 integrations/brython/index.py create mode 100644 integrations/brython/library.html diff --git a/integrations/brython/ReadMe.md b/integrations/brython/ReadMe.md new file mode 100755 index 00000000000..a8d86913689 --- /dev/null +++ b/integrations/brython/ReadMe.md @@ -0,0 +1,21 @@ +## Getting Started with Brython + +* Brython was designed for replacing JavaScript with Python. +* This tutorial will show you how to get started quickly. + +### 1. Get a web server up and running: + +```bash +python -m http.server +``` +(You can always stop the server by using ``CTRL-C``.) + +### 2. Navigate to [http://localhost:8000/](http://localhost:8000/) + +Now click on the examples to see Brython in action. + +### 3. For more info, see the following: + +* https://brython.info/ +* https://pypi.org/project/brython/ +* https://github.com/brython-dev/brython diff --git a/integrations/brython/index.html b/integrations/brython/index.html new file mode 100644 index 00000000000..52241c94e0c --- /dev/null +++ b/integrations/brython/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + + +

+ + + +
+ +

+ Library / Indexed DB Example +

+
+ + + \ No newline at end of file diff --git a/integrations/brython/index.py b/integrations/brython/index.py new file mode 100644 index 00000000000..2e147e6dd3f --- /dev/null +++ b/integrations/brython/index.py @@ -0,0 +1,5 @@ +from browser import document + + +def setup_page(): + document['topHeader'].textContent = "Brython Examples:" diff --git a/integrations/brython/library.html b/integrations/brython/library.html new file mode 100644 index 00000000000..822c15e9f5b --- /dev/null +++ b/integrations/brython/library.html @@ -0,0 +1,203 @@ + + + + + + + + + + +

Library

+ +
TitleAuthorISBNActions
+ + + + \ No newline at end of file From 0b1662a1202fa65f3b8b1f9e3b8183cf98720600 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 13 Apr 2020 03:58:51 -0400 Subject: [PATCH 2/9] Improve JS method reliability --- seleniumbase/fixtures/base_case.py | 2 ++ seleniumbase/fixtures/js_utils.py | 1 + 2 files changed, 3 insertions(+) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index da9a7faafd4..d45ada0e687 100755 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -3130,9 +3130,11 @@ def export_tour(self, name=None, filename="my_tour.js", url=None): def activate_jquery_confirm(self): """ See https://craftpip.github.io/jquery-confirm/ for usage. """ js_utils.activate_jquery_confirm(self.driver) + self.wait_for_ready_state_complete() def activate_messenger(self): js_utils.activate_messenger(self.driver) + self.wait_for_ready_state_complete() def set_messenger_theme(self, theme="default", location="default", max_messages="default"): diff --git a/seleniumbase/fixtures/js_utils.py b/seleniumbase/fixtures/js_utils.py index a0815795476..724feca8c20 100755 --- a/seleniumbase/fixtures/js_utils.py +++ b/seleniumbase/fixtures/js_utils.py @@ -457,6 +457,7 @@ def activate_messenger(driver): "theme: 'future'}") add_js_link(driver, jquery_js) + wait_for_jquery_active(driver, timeout=0.2) add_css_link(driver, messenger_css) add_css_link(driver, msgr_theme_flat_css) add_css_link(driver, msgr_theme_future_css) From 039e52af5b522c813cb3ce5a7693e9a6173abfb5 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 13 Apr 2020 04:00:33 -0400 Subject: [PATCH 3/9] Add methods for pressing arrow keys --- help_docs/method_summary.md | 8 +++ seleniumbase/fixtures/base_case.py | 86 ++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) diff --git a/help_docs/method_summary.md b/help_docs/method_summary.md index befa7c2d7d3..fce7b2aacda 100755 --- a/help_docs/method_summary.md +++ b/help_docs/method_summary.md @@ -187,6 +187,14 @@ self.highlight_update_text(selector, new_value, by=By.CSS_SELECTOR, loops=3, scr self.highlight(selector, by=By.CSS_SELECTOR, loops=4, scroll=True) +self.press_up_arrow(selector="html", times=1, by=By.CSS_SELECTOR) + +self.press_down_arrow(selector="html", times=1, by=By.CSS_SELECTOR) + +self.press_left_arrow(selector="html", times=1, by=By.CSS_SELECTOR) + +self.press_right_arrow(selector="html", times=1, by=By.CSS_SELECTOR) + self.scroll_to(selector, by=By.CSS_SELECTOR) self.slow_scroll_to(selector, by=By.CSS_SELECTOR) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index d45ada0e687..97f720f76d3 100755 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -1948,6 +1948,90 @@ def __highlight_with_js(self, selector, loops, o_bs): def __highlight_with_jquery(self, selector, loops, o_bs): js_utils.highlight_with_jquery(self.driver, selector, loops, o_bs) + def press_up_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR): + """ Simulates pressing the UP Arrow on the keyboard. + By default, "html" will be used as the CSS Selector target. + You can specify how many times in-a-row the action happens. """ + if times < 1: + return + element = self.wait_for_element_present(selector) + self.__demo_mode_highlight_if_active(selector, by) + if not self.demo_mode: + self.__scroll_to_element(element, selector, by) + for i in range(int(times)): + try: + element.send_keys(Keys.ARROW_UP) + except Exception: + self.wait_for_ready_state_complete() + element = self.wait_for_element_visible(selector) + element.send_keys(Keys.ARROW_UP) + time.sleep(0.01) + if self.slow_mode: + time.sleep(0.1) + + def press_down_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR): + """ Simulates pressing the DOWN Arrow on the keyboard. + By default, "html" will be used as the CSS Selector target. + You can specify how many times in-a-row the action happens. """ + if times < 1: + return + element = self.wait_for_element_present(selector) + self.__demo_mode_highlight_if_active(selector, by) + if not self.demo_mode: + self.__scroll_to_element(element, selector, by) + for i in range(int(times)): + try: + element.send_keys(Keys.ARROW_DOWN) + except Exception: + self.wait_for_ready_state_complete() + element = self.wait_for_element_visible(selector) + element.send_keys(Keys.ARROW_DOWN) + time.sleep(0.01) + if self.slow_mode: + time.sleep(0.1) + + def press_left_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR): + """ Simulates pressing the LEFT Arrow on the keyboard. + By default, "html" will be used as the CSS Selector target. + You can specify how many times in-a-row the action happens. """ + if times < 1: + return + element = self.wait_for_element_present(selector) + self.__demo_mode_highlight_if_active(selector, by) + if not self.demo_mode: + self.__scroll_to_element(element, selector, by) + for i in range(int(times)): + try: + element.send_keys(Keys.ARROW_LEFT) + except Exception: + self.wait_for_ready_state_complete() + element = self.wait_for_element_visible(selector) + element.send_keys(Keys.ARROW_LEFT) + time.sleep(0.01) + if self.slow_mode: + time.sleep(0.1) + + def press_right_arrow(self, selector="html", times=1, by=By.CSS_SELECTOR): + """ Simulates pressing the RIGHT Arrow on the keyboard. + By default, "html" will be used as the CSS Selector target. + You can specify how many times in-a-row the action happens. """ + if times < 1: + return + element = self.wait_for_element_present(selector) + self.__demo_mode_highlight_if_active(selector, by) + if not self.demo_mode: + self.__scroll_to_element(element, selector, by) + for i in range(int(times)): + try: + element.send_keys(Keys.ARROW_RIGHT) + except Exception: + self.wait_for_ready_state_complete() + element = self.wait_for_element_visible(selector) + element.send_keys(Keys.ARROW_RIGHT) + time.sleep(0.01) + if self.slow_mode: + time.sleep(0.1) + def scroll_to(self, selector, by=By.CSS_SELECTOR, timeout=None): ''' Fast scroll to destination ''' if not timeout: @@ -1987,6 +2071,7 @@ def slow_scroll_to(self, selector, by=By.CSS_SELECTOR, timeout=None): self.__slow_scroll_to_element(element) def scroll_to_top(self): + """ Scroll to the top of the page. """ scroll_script = "window.scrollTo(0, 0);" try: self.execute_script(scroll_script) @@ -1996,6 +2081,7 @@ def scroll_to_top(self): return False def scroll_to_bottom(self): + """ Scroll to the bottom of the page. """ scroll_script = "window.scrollTo(0, 10000);" try: self.execute_script(scroll_script) From fd20ad589e8dc0233bf0499bdd51dcf213c6d40f Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 13 Apr 2020 04:01:18 -0400 Subject: [PATCH 4/9] Update the language translations --- seleniumbase/translate/chinese.py | 16 ++++++++++++++++ seleniumbase/translate/french.py | 16 ++++++++++++++++ seleniumbase/translate/italian.py | 16 ++++++++++++++++ seleniumbase/translate/japanese.py | 16 ++++++++++++++++ seleniumbase/translate/korean.py | 16 ++++++++++++++++ seleniumbase/translate/portuguese.py | 16 ++++++++++++++++ seleniumbase/translate/spanish.py | 16 ++++++++++++++++ 7 files changed, 112 insertions(+) diff --git a/seleniumbase/translate/chinese.py b/seleniumbase/translate/chinese.py index 93dc4830222..2fb52da3362 100755 --- a/seleniumbase/translate/chinese.py +++ b/seleniumbase/translate/chinese.py @@ -199,3 +199,19 @@ def 悬停并单击(self, *args, **kwargs): def 是否被选中(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def 按向上箭头(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 按向下箭头(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 按向左箭头(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 按向右箭头(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/french.py b/seleniumbase/translate/french.py index c585a1de7ff..d20e506f3af 100755 --- a/seleniumbase/translate/french.py +++ b/seleniumbase/translate/french.py @@ -199,3 +199,19 @@ def planer_au_dessus_et_cliquez(self, *args, **kwargs): def est_il_sélectionné(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def appuyez_sur_la_flèche_vers_le_haut(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def appuyez_sur_la_flèche_vers_le_bas(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def appuyez_sur_la_flèche_gauche(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def appuyez_sur_la_flèche_droite(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/italian.py b/seleniumbase/translate/italian.py index 64dc2bdd380..53b80995414 100755 --- a/seleniumbase/translate/italian.py +++ b/seleniumbase/translate/italian.py @@ -199,3 +199,19 @@ def passa_il_mouse_sopra_e_fai_clic(self, *args, **kwargs): def è_selezionato(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def premere_la_freccia_su(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def premere_la_freccia_giù(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def premere_la_freccia_sinistra(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def premere_la_freccia_destra(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/japanese.py b/seleniumbase/translate/japanese.py index a77ed868ccb..7b7d8e044f3 100755 --- a/seleniumbase/translate/japanese.py +++ b/seleniumbase/translate/japanese.py @@ -199,3 +199,19 @@ def 上にマウスを移動しクリック(self, *args, **kwargs): def 選択されていることを(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def 上矢印を押します(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 下矢印を押します(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 左矢印を押します(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 右矢印を押します(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/korean.py b/seleniumbase/translate/korean.py index 6c09c1542a7..e000892ec42 100755 --- a/seleniumbase/translate/korean.py +++ b/seleniumbase/translate/korean.py @@ -199,3 +199,19 @@ def 위로_마우스를_이동하고_클릭(self, *args, **kwargs): def 선택되어_있는지(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def 위쪽_화살표를_누릅니다(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 아래쪽_화살표를_누르십시오(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 왼쪽_화살표를_누르십시오(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def 오른쪽_화살표를_누르십시오(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/portuguese.py b/seleniumbase/translate/portuguese.py index 2f293bf3115..ce8b0436699 100755 --- a/seleniumbase/translate/portuguese.py +++ b/seleniumbase/translate/portuguese.py @@ -199,3 +199,19 @@ def passe_o_mouse_e_clique(self, *args, **kwargs): def é_selecionado(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def pressione_a_seta_para_cima(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def pressione_a_seta_para_baixo(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def pressione_a_seta_esquerda(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def pressione_a_seta_direita(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) diff --git a/seleniumbase/translate/spanish.py b/seleniumbase/translate/spanish.py index befd9fbb83e..d33e36c60f9 100755 --- a/seleniumbase/translate/spanish.py +++ b/seleniumbase/translate/spanish.py @@ -199,3 +199,19 @@ def pasar_el_ratón_y_hacer_clic(self, *args, **kwargs): def está_seleccionado(self, *args, **kwargs): # is_selected(selector) return self.is_selected(*args, **kwargs) + + def presione_la_flecha_hacia_arriba(self, *args, **kwargs): + # press_up_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def presione_la_flecha_hacia_abajo(self, *args, **kwargs): + # press_down_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def presione_la_flecha_izquierda(self, *args, **kwargs): + # press_left_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) + + def presione_la_flecha_derecha(self, *args, **kwargs): + # press_right_arrow(selector="html", times=1) + return self.is_selected(*args, **kwargs) From f26019776dc3be9ff350c509bb99a20452f9b839 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Mon, 13 Apr 2020 04:03:19 -0400 Subject: [PATCH 5/9] Update the offline demo page with the associated test --- examples/offline_examples/demo_page.html | 26 ++++----------------- examples/offline_examples/test_demo_page.py | 21 ++++++++--------- 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/examples/offline_examples/demo_page.html b/examples/offline_examples/demo_page.html index d4eceb061ad..09f668f0f24 100644 --- a/examples/offline_examples/demo_page.html +++ b/examples/offline_examples/demo_page.html @@ -318,8 +318,8 @@

Automation Practice

Input Slider Control: - Automation Practice var s = document.getElementById("mySlider"); var p = document.getElementById("progressBar"); var pl = document.getElementById("progressLabel"); - if (s.value == "0") { - p.value = "0"; - pl.textContent = "Progress Bar: (0%)"; - } - if (s.value == "1") { - p.value = "25"; - pl.textContent = "Progress Bar: (25%)"; - } - if (s.value == "2") { - p.value = "50"; - pl.textContent = "Progress Bar: (50%)"; - } - if (s.value == "3") { - p.value = "75"; - pl.textContent = "Progress Bar: (75%)"; - } - if (s.value == "4") { - p.value = "100"; - pl.textContent = "Progress Bar: (100%)"; - } + p.value = s.value; + pl.textContent = "Progress Bar: (" + p.value + "%)"; }