@@ -203,15 +203,16 @@ def test_presentation(self):
203
203
"<h4>What are some disadvantages of using <b>raw</b> Selenium "
204
204
"without additional libraries or frameworks?</h4><hr />"
205
205
"<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" ,
207
208
)
208
209
self .add_slide (
209
210
"<h4>What are some disadvantages of using <b>raw</b> Selenium "
210
211
"without additional libraries or frameworks?</h4><hr />"
211
212
"<h4>\n "
212
213
"<mark>The default timeout is 0: If an element isn't immediately "
213
214
"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 "
215
216
"</h4>\n " ,
216
217
image = "https://seleniumbase.io/other/messy_stacktrace.png" ,
217
218
)
@@ -254,6 +255,21 @@ def test_presentation(self):
254
255
"<mark>A test framework can provide those!</mark>" ,
255
256
image = "https://seleniumbase.io/cdn/img/dash_report.png" ,
256
257
)
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
+ )
257
273
self .add_slide (
258
274
"<h4>Raw Selenium disadvantages, continued...</h4><hr />\n "
259
275
"<br />\n "
@@ -265,7 +281,8 @@ def test_presentation(self):
265
281
'element.submit()\n '
266
282
"</pre>\n "
267
283
"<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 "
269
286
'<pre>self.type("#password", "secret_sauce\\ n")</pre>'
270
287
)
271
288
self .add_slide (
@@ -329,6 +346,164 @@ def test_presentation(self):
329
346
"<h3><code><mark>pip install seleniumbase</mark></code></h3>" ,
330
347
image = "https://seleniumbase.io/other/seleniumbase_github.png" ,
331
348
)
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
+ )
332
507
self .add_slide (
333
508
"<h2><b>Live Demo Time!</b></h2><hr /><br />"
334
509
"<h3>(Starting with raw Selenium, and evolving that into "
0 commit comments