Skip to content

Commit 9674ab5

Browse files
authored
Merge pull request #2140 from seleniumbase/driver-options-and-more
Driver options and more
2 parents 1e219ce + 1275cbe commit 9674ab5

29 files changed

+466
-72
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Feature: SeleniumBase scenarios for the Simple App
2+
3+
Scenario: Verify Simple App (log in / sign out)
4+
Given Open "seleniumbase.io/simple/login"
5+
And Clear Session Storage
6+
And Type "demo_user" into "#username"
7+
And Type "secret_pass" into "#password"
8+
And Click 'a:contains("Sign in")'
9+
And Assert exact text "Welcome!" in "h1"
10+
And Assert element "img#image1"
11+
And Highlight "#image1"
12+
And Click link "Sign out"
13+
And Assert text "signed out" in "#top_message"

examples/hack_the_planet.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,12 @@ def test_all_your_base_are_belong_to_us(self):
284284
self.open("https://wordpress.com/")
285285
zoom_out = "h1.is-page-header{zoom: 0.8;-moz-transform: scale(0.8);}"
286286
self.add_css_style(zoom_out)
287-
zoom_in = "div.lp-is-cta-blue{zoom: 1.4;-moz-transform: scale(1.4);}"
287+
zoom_in = "a.wp-element-button{zoom: 1.4;-moz-transform: scale(1.4);}"
288288
self.add_css_style(zoom_in)
289289
self.set_text_content("h1.is-page-header", aybabtu)
290-
self.set_text_content("main div.lp-is-cta-blue", "Use SeleniumBase!")
290+
self.set_text_content("a.wp-element-button", "Use SeleniumBase!")
291291
self.highlight("h1.is-page-header", loops=6, scroll=False)
292-
self.highlight("main div.lp-is-cta-blue", loops=4, scroll=False)
292+
self.highlight("a.wp-element-button", loops=4, scroll=False)
293293

294294
self.open("https://seleniumbase.com/")
295295
self.set_text_content("h1", aybabtu)

examples/raw_browser_launcher.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
driver = Driver(browser="chrome", headless=False)
55
try:
6-
driver.get("https://seleniumbase.io/apps/calculator")
6+
driver.open("seleniumbase.io/apps/calculator")
77
driver.click('[id="4"]')
88
driver.click('[id="2"]')
99
driver.assert_text("42", "#output")
@@ -13,7 +13,7 @@
1313

1414
driver = Driver()
1515
try:
16-
driver.get("https://seleniumbase.github.io/demo_page")
16+
driver.open("seleniumbase.github.io/demo_page")
1717
driver.highlight("h2")
1818
driver.type("#myTextInput", "Automation")
1919
driver.click("#checkBox1")

examples/raw_driver_context.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
from seleniumbase import DriverContext
33

44
with DriverContext() as driver:
5-
driver.get("https://seleniumbase.github.io/")
5+
driver.open("seleniumbase.github.io/")
66
driver.highlight('img[alt="SeleniumBase"]', loops=6)
77

88
with DriverContext(browser="chrome", incognito=True) as driver:
9-
driver.get("https://seleniumbase.io/apps/calculator")
9+
driver.open("seleniumbase.io/apps/calculator")
1010
driver.click('[id="4"]')
1111
driver.click('[id="2"]')
1212
driver.assert_text("42", "#output")
1313
driver.highlight("#output", loops=6)
1414

1515
with DriverContext() as driver:
16-
driver.get("https://seleniumbase.github.io/demo_page")
16+
driver.open("seleniumbase.github.io/demo_page")
1717
driver.highlight("h2")
1818
driver.type("#myTextInput", "Automation")
1919
driver.click("#checkBox1")

examples/raw_login_context.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from seleniumbase import DriverContext
2+
3+
with DriverContext() as driver:
4+
driver.open("seleniumbase.io/simple/login")
5+
driver.type("#username", "demo_user")
6+
driver.type("#password", "secret_pass")
7+
driver.click('a:contains("Sign in")')
8+
driver.assert_exact_text("Welcome!", "h1")
9+
driver.assert_element("img#image1")
10+
driver.highlight("#image1")
11+
driver.click_link("Sign out")
12+
driver.assert_text("signed out", "#top_message")

examples/raw_login_driver.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from seleniumbase import Driver
2+
3+
driver = Driver()
4+
try:
5+
driver.open("seleniumbase.io/simple/login")
6+
driver.type("#username", "demo_user")
7+
driver.type("#password", "secret_pass")
8+
driver.click('a:contains("Sign in")')
9+
driver.assert_exact_text("Welcome!", "h1")
10+
driver.assert_element("img#image1")
11+
driver.highlight("#image1")
12+
driver.click_link("Sign out")
13+
driver.assert_text("signed out", "#top_message")
14+
finally:
15+
driver.quit()

examples/raw_login_sb.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from seleniumbase import SB
2+
3+
with SB() as sb:
4+
sb.open("seleniumbase.io/simple/login")
5+
sb.type("#username", "demo_user")
6+
sb.type("#password", "secret_pass")
7+
sb.click('a:contains("Sign in")')
8+
sb.assert_exact_text("Welcome!", "h1")
9+
sb.assert_element("img#image1")
10+
sb.highlight("#image1")
11+
sb.click_link("Sign out")
12+
sb.assert_text("signed out", "#top_message")

examples/raw_uc_mode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
if not sb.is_text_visible("OH YEAH, you passed!", "h1"):
1212
if sb.is_element_visible('iframe[src*="challenge"]'):
1313
with sb.frame_switch('iframe[src*="challenge"]'):
14-
sb.click("area")
14+
sb.click("span.mark")
1515
sb.sleep(4)
1616
sb.activate_demo_mode()
1717
sb.assert_text("OH YEAH, you passed!", "h1", timeout=3)

examples/sb_fixture_tests.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# "sb" pytest fixture test in a method with no class
2+
def test_sb_fixture_with_no_class(sb):
3+
sb.open("seleniumbase.io/simple/login")
4+
sb.type("#username", "demo_user")
5+
sb.type("#password", "secret_pass")
6+
sb.click('a:contains("Sign in")')
7+
sb.assert_exact_text("Welcome!", "h1")
8+
sb.assert_element("img#image1")
9+
sb.highlight("#image1")
10+
sb.click_link("Sign out")
11+
sb.assert_text("signed out", "#top_message")
12+
13+
14+
# "sb" pytest fixture test in a method inside a class
15+
class Test_SB_Fixture:
16+
def test_sb_fixture_inside_class(self, sb):
17+
sb.open("seleniumbase.io/simple/login")
18+
sb.type("#username", "demo_user")
19+
sb.type("#password", "secret_pass")
20+
sb.click('a:contains("Sign in")')
21+
sb.assert_exact_text("Welcome!", "h1")
22+
sb.assert_element("img#image1")
23+
sb.highlight("#image1")
24+
sb.click_link("Sign out")
25+
sb.assert_text("signed out", "#top_message")

examples/test_override_sb_fixture.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ def sb(request):
77
from selenium import webdriver
88
from seleniumbase import BaseCase
99
from seleniumbase import config as sb_config
10+
from seleniumbase.core import session_helper
1011

1112
class BaseClass(BaseCase):
1213
def get_new_driver(self, *args, **kwargs):
@@ -31,6 +32,11 @@ def tearDown(self):
3132
super().tearDown()
3233

3334
if request.cls:
35+
if sb_config.reuse_class_session:
36+
the_class = str(request.cls).split(".")[-1].split("'")[0]
37+
if the_class != sb_config._sb_class:
38+
session_helper.end_reused_class_session_as_needed()
39+
sb_config._sb_class = the_class
3440
request.cls.sb = BaseClass("base_method")
3541
request.cls.sb.setUp()
3642
request.cls.sb._needs_tearDown = True

examples/test_sb_fixture.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# "sb" pytest fixture test in a method with no class
22
def test_sb_fixture_with_no_class(sb):
3-
sb.open("https://seleniumbase.io/help_docs/install/")
3+
sb.open("seleniumbase.io/help_docs/install/")
44
sb.type('input[aria-label="Search"]', "GUI Commander")
55
sb.click('mark:contains("Commander")')
66
sb.assert_title_contains("GUI / Commander")
@@ -9,7 +9,7 @@ def test_sb_fixture_with_no_class(sb):
99
# "sb" pytest fixture test in a method inside a class
1010
class Test_SB_Fixture:
1111
def test_sb_fixture_inside_class(self, sb):
12-
sb.open("https://seleniumbase.io/help_docs/install/")
12+
sb.open("seleniumbase.io/help_docs/install/")
1313
sb.type('input[aria-label="Search"]', "GUI Commander")
1414
sb.click('mark:contains("Commander")')
1515
sb.assert_title_contains("GUI / Commander")

examples/test_scrape_bing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
class ScrapeBingTests(BaseCase):
66
def test_scrape_bing(self):
7-
self.open(r"https://www.bing.com/search?q=SeleniumBase%20GitHub")
7+
self.open("www.bing.com/search?q=SeleniumBase+GitHub&qs=n&form=QBRE")
88
self.wait_for_element("main h2 a")
99
soup = self.get_beautiful_soup()
1010
titles = [item.text for item in soup.select("main h2 a")]

examples/test_simple_login.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from seleniumbase import BaseCase
2+
BaseCase.main(__name__, __file__)
3+
4+
5+
class TestSimpleLogin(BaseCase):
6+
def test_simple_login(self):
7+
self.open("seleniumbase.io/simple/login")
8+
self.type("#username", "demo_user")
9+
self.type("#password", "secret_pass")
10+
self.click('a:contains("Sign in")')
11+
self.assert_exact_text("Welcome!", "h1")
12+
self.assert_element("img#image1")
13+
self.highlight("#image1")
14+
self.click_link("Sign out")
15+
self.assert_text("signed out", "#top_message")

examples/uc_cdp_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_display_cdp_events(self):
3434
except Exception:
3535
if self.is_element_visible('iframe[src*="challenge"]'):
3636
with self.frame_switch('iframe[src*="challenge"]'):
37-
self.click("area")
37+
self.click("span.mark")
3838
else:
3939
self.fail_me()
4040
try:

examples/verify_undetected.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_browser_is_undetected(self):
2929
except Exception:
3030
if self.is_element_visible('iframe[src*="challenge"]'):
3131
with self.frame_switch('iframe[src*="challenge"]'):
32-
self.click("area")
32+
self.click("span.mark")
3333
else:
3434
self.fail_me()
3535
try:

help_docs/method_summary.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ self.send_keys(selector, text, by="css selector", timeout=None)
4141
# Duplicates:
4242
# self.add_text(selector, text, by="css selector", timeout=None)
4343

44+
self.press_keys(selector, text, by="css selector", timeout=None)
45+
4446
self.submit(selector, by="css selector")
4547

4648
self.clear(selector, by="css selector", timeout=None)
@@ -467,8 +469,12 @@ self.get_downloads_folder()
467469

468470
self.get_browser_downloads_folder()
469471

472+
self.get_downloaded_files(regex=None, browser=False)
473+
470474
self.get_path_of_downloaded_file(file, browser=False)
471475

476+
self.get_data_from_downloaded_file(file, timeout=None, browser=False)
477+
472478
self.is_downloaded_file_present(file, browser=False)
473479

474480
self.is_downloaded_file_regex_present(regex, browser=False)
@@ -480,6 +486,8 @@ self.assert_downloaded_file(file, timeout=None, browser=False)
480486

481487
self.assert_downloaded_file_regex(regex, timeout=None, browser=False)
482488

489+
self.assert_data_in_downloaded_file(data, file, timeout=None, browser=False)
490+
483491
self.assert_true(expr, msg=None)
484492

485493
self.assert_false(expr, msg=None)

help_docs/syntax_formats.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ def sb(request):
302302
from selenium import webdriver
303303
from seleniumbase import BaseCase
304304
from seleniumbase import config as sb_config
305+
from seleniumbase.core import session_helper
305306

306307
class BaseClass(BaseCase):
307308
def get_new_driver(self, *args, **kwargs):
@@ -326,6 +327,11 @@ def sb(request):
326327
super().tearDown()
327328

328329
if request.cls:
330+
if sb_config.reuse_class_session:
331+
the_class = str(request.cls).split(".")[-1].split("'")[0]
332+
if the_class != sb_config._sb_class:
333+
session_helper.end_reused_class_session_as_needed()
334+
sb_config._sb_class = the_class
329335
request.cls.sb = BaseClass("base_method")
330336
request.cls.sb.setUp()
331337
request.cls.sb._needs_tearDown = True
@@ -877,18 +883,18 @@ This pure Python format gives you a raw <code translate="no">webdriver</code> in
877883
from seleniumbase import DriverContext
878884

879885
with DriverContext() as driver:
880-
driver.get("https://seleniumbase.github.io/")
886+
driver.open("seleniumbase.github.io/")
881887
driver.highlight('img[alt="SeleniumBase"]', loops=6)
882888

883889
with DriverContext(browser="chrome", incognito=True) as driver:
884-
driver.get("https://seleniumbase.io/apps/calculator")
890+
driver.open("seleniumbase.io/apps/calculator")
885891
driver.click('[id="4"]')
886892
driver.click('[id="2"]')
887893
driver.assert_text("42", "#output")
888894
driver.highlight("#output", loops=6)
889895

890896
with DriverContext() as driver:
891-
driver.get("https://seleniumbase.github.io/demo_page")
897+
driver.open("seleniumbase.github.io/demo_page")
892898
driver.highlight("h2")
893899
driver.type("#myTextInput", "Automation")
894900
driver.click("#checkBox1")
@@ -908,7 +914,7 @@ from seleniumbase import Driver
908914

909915
driver = Driver(browser="chrome", headless=False)
910916
try:
911-
driver.get("https://seleniumbase.io/apps/calculator")
917+
driver.open("seleniumbase.io/apps/calculator")
912918
driver.click('[id="4"]')
913919
driver.click('[id="2"]')
914920
driver.assert_text("42", "#output")
@@ -918,7 +924,7 @@ finally:
918924

919925
driver = Driver()
920926
try:
921-
driver.get("https://seleniumbase.github.io/demo_page")
927+
driver.open("seleniumbase.github.io/demo_page")
922928
driver.highlight("h2")
923929
driver.type("#myTextInput", "Automation")
924930
driver.click("#checkBox1")

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ paginate==0.5.6
2020
pyquery==2.0.0
2121
readtime==3.0.0
2222
mkdocs==1.5.3
23-
mkdocs-material==9.3.2
23+
mkdocs-material==9.4.1
2424
mkdocs-exclude-search==0.6.5
2525
mkdocs-simple-hooks==0.1.5
2626
mkdocs-material-extensions==1.2

sbase/steps.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,40 @@ def jquery_type(context, text, selector):
11291129
sb.jquery_type(selector, text)
11301130

11311131

1132+
@step("Press keys '{text}' in '{selector}'")
1133+
@step('Press keys "{text}" in "{selector}"')
1134+
@step("Press keys '{text}' in \"{selector}\"")
1135+
@step('Press keys "{text}" in \'{selector}\'')
1136+
@step("Press keys '{text}' into '{selector}'")
1137+
@step('Press keys "{text}" into "{selector}"')
1138+
@step("Press keys '{text}' into \"{selector}\"")
1139+
@step('Press keys "{text}" into \'{selector}\'')
1140+
@step("In '{selector}' press keys '{text}'")
1141+
@step('In "{selector}" press keys "{text}"')
1142+
@step("In '{selector}' press keys \"{text}\"")
1143+
@step('In "{selector}" press keys \'{text}\'')
1144+
@step("Into '{selector}' press keys '{text}'")
1145+
@step('Into "{selector}" press keys "{text}"')
1146+
@step("Into '{selector}' press keys \"{text}\"")
1147+
@step('Into "{selector}" press keys \'{text}\'')
1148+
@step("Find '{selector}' and press keys '{text}'")
1149+
@step('Find "{selector}" and press keys "{text}"')
1150+
@step("Find '{selector}' and press keys \"{text}\"")
1151+
@step('Find "{selector}" and press keys \'{text}\'')
1152+
@step("User presses keys '{text}' in '{selector}'")
1153+
@step('User presses keys "{text}" in "{selector}"')
1154+
@step("User presses keys '{text}' in \"{selector}\"")
1155+
@step('User presses keys "{text}" in \'{selector}\'')
1156+
@step("User presses keys '{text}' into '{selector}'")
1157+
@step('User presses keys "{text}" into "{selector}"')
1158+
@step("User presses keys '{text}' into \"{selector}\"")
1159+
@step('User presses keys "{text}" into \'{selector}\'')
1160+
def press_keys(context, text, selector):
1161+
sb = context.sb
1162+
text = normalize_text(text)
1163+
sb.press_keys(selector, text)
1164+
1165+
11321166
@step("Find '{selector}' and set {attribute} to '{value}'")
11331167
@step('Find "{selector}" and set {attribute} to "{value}"')
11341168
@step("Find '{selector}' and set {attribute} to \"{value}\"")

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.18.8"
2+
__version__ = "4.18.9"

seleniumbase/behave/behave_helper.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,24 @@ def generate_gherkin(srt_actions):
119119
sb_actions.append(
120120
"jQuery type '%s' in '%s'" % (text, action[1])
121121
)
122+
elif action[0] == "pkeys":
123+
text = action[2].replace("\n", "\\n")
124+
if '"' not in text and '"' not in action[1]:
125+
sb_actions.append(
126+
'Press keys "%s" in "%s"' % (text, action[1])
127+
)
128+
elif '"' in text and '"' not in action[1]:
129+
sb_actions.append(
130+
'Press keys \'%s\' in "%s"' % (text, action[1])
131+
)
132+
elif '"' not in text and '"' in action[1]:
133+
sb_actions.append(
134+
'Press keys "%s" in \'%s\'' % (text, action[1])
135+
)
136+
elif '"' in text and '"' in action[1]:
137+
sb_actions.append(
138+
"Press keys '%s' in '%s'" % (text, action[1])
139+
)
122140
elif action[0] == "hover":
123141
if '"' not in action[1]:
124142
sb_actions.append('Hover "%s"' % action[1])

0 commit comments

Comments
 (0)