@@ -203,15 +203,16 @@ def test_presentation(self):
203203 "<h4>What are some disadvantages of using <b>raw</b> Selenium "
204204 "without additional libraries or frameworks?</h4><hr />"
205205 "<h4>\n "
206- "<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />" ,
206+ "<br />" ,
207+ image = "https://seleniumbase.io/other/sel_and_py_2.png" ,
207208 )
208209 self .add_slide (
209210 "<h4>What are some disadvantages of using <b>raw</b> Selenium "
210211 "without additional libraries or frameworks?</h4><hr />"
211212 "<h4>\n "
212213 "<mark>The default timeout is 0: If an element isn't immediately "
213214 "ready to be interacted with, you'll get errors when trying "
214- "to interact with those elements.<mark>\n "
215+ "to interact with those elements.</ mark>\n "
215216 "</h4>\n " ,
216217 image = "https://seleniumbase.io/other/messy_stacktrace.png" ,
217218 )
@@ -254,6 +255,21 @@ def test_presentation(self):
254255 "<mark>A test framework can provide those!</mark>" ,
255256 image = "https://seleniumbase.io/cdn/img/dash_report.png" ,
256257 )
258+ self .add_slide (
259+ "<h4>Raw Selenium disadvantages, continued...</h4><hr />\n "
260+ "<br />\n "
261+ "<p><mark>It takes multiple lines of code to do simple tasks:"
262+ "</mark></p>\n "
263+ "<pre>\n "
264+ 'element = driver.find_element("css selector", "#password")\n '
265+ "element.clear()\n "
266+ 'element.send_keys("secret_sauce")\n '
267+ 'element.submit()\n '
268+ "</pre>\n "
269+ "<br />\n "
270+ "<p>But with a framework, do all that in ONE line:</p>\n "
271+ '<pre>self.type("#password", "secret_sauce\\ n")</pre>'
272+ )
257273 self .add_slide (
258274 "<h4>Raw Selenium disadvantages, continued...</h4><hr />\n "
259275 "<br />\n "
@@ -265,7 +281,8 @@ def test_presentation(self):
265281 'element.submit()\n '
266282 "</pre>\n "
267283 "<br />\n "
268- "<p>But with a framework:</p>\n "
284+ "<p><mark>But with a framework, do all that in ONE line:"
285+ "</mark></p>\n "
269286 '<pre>self.type("#password", "secret_sauce\\ n")</pre>'
270287 )
271288 self .add_slide (
@@ -329,6 +346,164 @@ def test_presentation(self):
329346 "<h3><code><mark>pip install seleniumbase</mark></code></h3>" ,
330347 image = "https://seleniumbase.io/other/seleniumbase_github.png" ,
331348 )
349+ self .add_slide (
350+ "<h3>SeleniumBase example test:</h3><hr />" ,
351+ code = (
352+ "from seleniumbase import BaseCase\n "
353+ "BaseCase.main(__name__, __file__)\n \n "
354+ "class MyTestClass(BaseCase):\n "
355+ " def test_basics(self):\n "
356+ ' self.open("https://www.saucedemo.com")\n '
357+ ' self.type("#user-name", "standard_user")\n '
358+ ' self.type("#password", "secret_sauce\\ n")\n '
359+ ' self.assert_element("div.inventory_list")\n '
360+ ' self.assert_exact_text("Products", "span.title")\n '
361+ " self.click('button[name*=\" backpack\" ]')\n "
362+ ' self.click("#shopping_cart_container a")\n '
363+ ' self.assert_exact_text("Your Cart", "span.title")\n '
364+ ' self.assert_text("Backpack", "div.cart_item")\n '
365+ ' self.click("button#checkout")\n '
366+ ' self.type("#first-name", "SeleniumBase")\n '
367+ ' self.type("#last-name", "Automation")\n '
368+ ' self.type("#postal-code", "77123")\n '
369+ ' self.click("input#continue")\n '
370+ ' self.assert_text("Checkout: Overview")'
371+ ),
372+ )
373+ self .add_slide (
374+ "<h3>Common SeleniumBase methods:</h3><hr />" ,
375+ code = (
376+ "self.open(url) # Navigate the browser window to the URL.\n "
377+ "self.type(selector, text) # Update field with the text.\n "
378+ "self.click(selector) # Click element with the selector.\n "
379+ "self.click_link(link_text) # Click link containing text.\n "
380+ "self.check_if_unchecked(selector) # Check checkbox.\n "
381+ "self.uncheck_if_checked(selector) # Uncheck checkbox.\n "
382+ "self.select_option_by_text(dropdown_selector, option)\n "
383+ "self.hover_and_click(hover_selector, click_selector)\n "
384+ "self.drag_and_drop(drag_selector, drop_selector)\n "
385+ "self.choose_file(selector, file_path) # Upload a file.\n "
386+ "self.switch_to_frame(frame) # Switch into the iframe.\n "
387+ "self.switch_to_default_content() # Exit all iframes.\n "
388+ "self.switch_to_parent_frame() # Exit current iframe.\n "
389+ "self.open_new_window() # Open new window in same browser.\n "
390+ "self.switch_to_window(window) # Switch to browser window.\n "
391+ "self.switch_to_default_window() # Go to original window.\n "
392+ "self.assert_element(selector) # Verify element is visible.\n "
393+ "self.assert_text(text, selector) # Verify text substring.\n "
394+ "self.assert_exact_text(text, selector) # Verify exact text."
395+ ),
396+ )
397+ self .add_slide (
398+ "<h3>Common command-line options:</h3><hr />"
399+ "<pre>\n "
400+ '<span class="kwd">--browser=BROWSER</span>'
401+ '<span class="str">'
402+ ' (Choose web browser. Default: "chrome".)'
403+ '</span>\n '
404+ '<span class="kwd">--edge / --firefox / --safari</span>'
405+ '<span class="str">'
406+ ' (Browser Shortcut.)'
407+ '</span>\n '
408+ '<span class="kwd">--headless</span>'
409+ '<span class="str">'
410+ ' (Run tests headlessly. Default on Linux OS.)'
411+ '</span>\n '
412+ '<span class="kwd">--demo</span>'
413+ '<span class="str">'
414+ ' (Slow down and see test actions as they occur.)'
415+ '</span>\n '
416+ '<span class="kwd">--slow</span>'
417+ '<span class="str">'
418+ ' (Slow down the automation. Faster than Demo Mode.)'
419+ '</span>\n '
420+ '<span class="kwd">--reuse-session / --rs</span>'
421+ '<span class="str">'
422+ ' (Reuse browser session for tests.)'
423+ '</span>\n '
424+ '<span class="kwd">--reuse-class-session / --rcs</span>'
425+ '<span class="str">'
426+ ' (RS, but for class tests.)'
427+ '</span>\n '
428+ '<span class="kwd">--crumbs</span>'
429+ '<span class="str">'
430+ ' (Clear cookies between tests reusing a session.)'
431+ '</span>\n '
432+ '<span class="kwd">--maximize</span>'
433+ '<span class="str">'
434+ ' (Start tests with the web browser maximized.)'
435+ '</span>\n '
436+ '<span class="kwd">--dashboard</span>'
437+ '<span class="str">'
438+ ' (Enable the SB Dashboard at dashboard.html)'
439+ '</span>\n '
440+ '<span class="kwd">--uc</span>'
441+ '<span class="str">'
442+ ' (Enable undetected-chromedriver mode.)'
443+ '</span>\n '
444+ '<span class="kwd">--incognito</span>'
445+ '<span class="str">'
446+ ' (Enable Incognito mode.)'
447+ '</span>\n '
448+ '<span class="kwd">--guest</span>'
449+ '<span class="str">'
450+ ' (Enable Guest mode.)'
451+ '</span>\n '
452+ '<span class="kwd">-m=MARKER</span>'
453+ '<span class="str">'
454+ ' (Run tests with the specified pytest marker.)'
455+ '</span>\n '
456+ '<span class="kwd">-n=NUM</span>'
457+ '<span class="str">'
458+ ' (Multithread the tests using that many threads.)'
459+ '</span>\n '
460+ '<span class="kwd">-v</span>'
461+ '<span class="str">'
462+ ' (Verbose mode. Print the full names of each test run.)'
463+ '</span>\n '
464+ '<span class="kwd">--html=report.html</span>'
465+ '<span class="str">'
466+ ' (Create a detailed pytest-html report.)'
467+ '</span>\n '
468+ '<span class="kwd">--collect-only / --co</span>'
469+ '<span class="str">'
470+ ' (Only show discovered tests. No run.)'
471+ '</span>\n '
472+ '<span class="kwd">--co -q</span>'
473+ '<span class="str">'
474+ ' (Only show full names of discovered tests. No run.)'
475+ '</span>\n '
476+ '<span class="kwd">-x</span>'
477+ '<span class="str">'
478+ ' (Stop running tests after the first failure is reached.)'
479+ '</span>\n '
480+ "</pre>"
481+ )
482+ self .add_slide (
483+ "<h3>Common console scripts:</h3><hr />" ,
484+ code = (
485+ "seleniumbase get [DRIVER] [OPTIONS] # Eg. chromedriver\n "
486+ "seleniumbase methods # List common Python methods\n "
487+ "seleniumbase options # List common pytest options\n "
488+ "seleniumbase gui # Open the SB GUI for pytest\n "
489+ "seleniumbase caseplans # Open the SB Case Plans App\n "
490+ "seleniumbase mkdir [DIRECTORY] # Create a test directory\n "
491+ "seleniumbase mkfile [FILE.py] # Create a test file\n "
492+ "seleniumbase codegen [FILE.py] [OPTIONS] # Record a test\n "
493+ "seleniumbase recorder # Open the SB Recorder App\n "
494+ "seleniumbase mkpres # Create a Presentation boilerplate\n "
495+ "seleniumbase mkchart # Create a Chart boilerplate\n "
496+ "seleniumbase print [FILE] # Print file to console\n "
497+ "seleniumbase translate [FILE.py] [OPTIONS] # Translate\n "
498+ "seleniumbase extract-objects [SB_FILE.py] # Get objects\n "
499+ "seleniumbase inject-objects [SB_FILE.py] # Swap selectors\n "
500+ "seleniumbase objectify [SB_FILE.py] # Get & swap objects\n "
501+ "seleniumbase revert-objects [SB_FILE.py] # Undo objectify\n "
502+ "seleniumbase download server # Get Selenium Grid JAR file\n "
503+ "seleniumbase grid-hub [start|stop] [OPTIONS] # Start Grid\n "
504+ "seleniumbase grid-node [start|stop] --hub=[IP] # Add Node"
505+ ),
506+ )
332507 self .add_slide (
333508 "<h2><b>Live Demo Time!</b></h2><hr /><br />"
334509 "<h3>(Starting with raw Selenium, and evolving that into "
0 commit comments