Skip to content

Commit 1e30863

Browse files
committed
Add more options when saving a screenshot
1 parent 5baddcd commit 1e30863

File tree

2 files changed

+47
-13
lines changed

2 files changed

+47
-13
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,18 +2779,35 @@ def switch_to_default_driver(self):
27792779
if self.driver in self.__driver_browser_map:
27802780
self.browser = self.__driver_browser_map[self.driver]
27812781

2782-
def save_screenshot(self, name, folder=None):
2783-
"""Saves a screenshot of the current page.
2782+
def save_screenshot(
2783+
self, name, folder=None, selector=None, by=By.CSS_SELECTOR
2784+
):
2785+
"""
2786+
Saves a screenshot of the current page.
27842787
If no folder is specified, uses the folder where pytest was called.
2785-
The screenshot will be in PNG format."""
2788+
The screenshot will include the entire page unless a selector is given.
2789+
If a provided selector is not found, then takes a full-page screenshot.
2790+
If the folder provided doesn't exist, it will get created.
2791+
The screenshot will be in PNG format: (*.png)
2792+
"""
27862793
self.wait_for_ready_state_complete()
2794+
if selector and by:
2795+
selector, by = self.__recalculate_selector(selector, by)
2796+
if page_actions.is_element_present(self.driver, selector, by):
2797+
return page_actions.save_screenshot(
2798+
self.driver, name, folder, selector, by
2799+
)
27872800
return page_actions.save_screenshot(self.driver, name, folder)
27882801

2789-
def save_screenshot_to_logs(self, name=None):
2802+
def save_screenshot_to_logs(
2803+
self, name=None, selector=None, by=By.CSS_SELECTOR
2804+
):
27902805
"""Saves a screenshot of the current page to the "latest_logs" folder.
27912806
Naming is automatic:
27922807
If NO NAME provided: "_1_screenshot.png", "_2_screenshot.png", etc.
27932808
If NAME IS provided, it becomes: "_1_name.png", "_2_name.png", etc.
2809+
The screenshot will include the entire page unless a selector is given.
2810+
If a provided selector is not found, then takes a full-page screenshot.
27942811
(The last_page / failure screenshot is always "screenshot.png")
27952812
The screenshot will be in PNG format."""
27962813
self.wait_for_ready_state_complete()
@@ -2809,6 +2826,12 @@ def save_screenshot_to_logs(self, name=None):
28092826
if len(name) == 0:
28102827
name = "screenshot"
28112828
name = "%s%s.png" % (pre_name, name)
2829+
if selector and by:
2830+
selector, by = self.__recalculate_selector(selector, by)
2831+
if page_actions.is_element_present(self.driver, selector, by):
2832+
return page_actions.save_screenshot(
2833+
self.driver, name, test_logpath, selector, by
2834+
)
28122835
return page_actions.save_screenshot(self.driver, name, test_logpath)
28132836

28142837
def save_page_source(self, name, folder=None):

seleniumbase/fixtures/page_actions.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -773,11 +773,16 @@ def find_visible_elements(driver, selector, by=By.CSS_SELECTOR):
773773
return v_elems
774774

775775

776-
def save_screenshot(driver, name, folder=None):
776+
def save_screenshot(
777+
driver, name, folder=None, selector=None, by=By.CSS_SELECTOR
778+
):
777779
"""
778-
Saves a screenshot to the current directory (or to a subfolder if provided)
780+
Saves a screenshot of the current page.
781+
If no folder is specified, uses the folder where pytest was called.
782+
The screenshot will include the entire page unless a selector is given.
783+
If a provided selector is not found, then takes a full-page screenshot.
779784
If the folder provided doesn't exist, it will get created.
780-
The screenshot will be in PNG format.
785+
The screenshot will be in PNG format: (*.png)
781786
"""
782787
if not name.endswith(".png"):
783788
name = name + ".png"
@@ -789,12 +794,18 @@ def save_screenshot(driver, name, folder=None):
789794
screenshot_path = "%s/%s" % (file_path, name)
790795
else:
791796
screenshot_path = name
792-
try:
793-
element = driver.find_element(by=By.TAG_NAME, value="body")
794-
element_png = element.screenshot_as_png
795-
with open(screenshot_path, "wb") as file:
796-
file.write(element_png)
797-
except Exception:
797+
if selector:
798+
try:
799+
element = driver.find_element(by=by, value=selector)
800+
element_png = element.screenshot_as_png
801+
with open(screenshot_path, "wb") as file:
802+
file.write(element_png)
803+
except Exception:
804+
if driver:
805+
driver.get_screenshot_as_file(screenshot_path)
806+
else:
807+
pass
808+
else:
798809
if driver:
799810
driver.get_screenshot_as_file(screenshot_path)
800811
else:

0 commit comments

Comments
 (0)