如何在Selenium和Python中获取页面中特定元素的截图?
我们可以获取Selenium页面中特定元素的截图。在执行任何测试用例时,我们可能会遇到特定元素的失败。为了查明特定元素的失败原因,我们会尝试捕获错误所在的截图。
元素错误可能由以下原因造成:
- 断言未通过。
- 应用程序和Selenium之间存在同步问题。
- 存在超时问题。
- 中途出现警报。
- 无法使用定位器识别元素。
- 实际结果和最终结果不匹配。
要捕获截图,可以使用`save_screenshot()`方法。此方法会捕获整个页面的截图。
没有内置方法可以捕获单个元素的截图。为此,我们必须将全页面截图裁剪到特定元素的大小。
语法
driver.save_screenshot('screenshot_t.png')
在参数中,我们必须提供截图文件名以及`.png`扩展名。如果使用其他扩展名,则会抛出警告消息,并且无法查看图像。
截图将保存在程序的同一路径下。
这里我们需要借助Webdriver中的`location`和`size`方法来裁剪图像。为此,我们需要导入PIL图像库。它可能包含在标准库中,也可能不包含。如果不可用,可以使用`pip install Pillow`命令安装。
每个元素都有一个唯一的(x, y)坐标位置。`location`方法给出元素的x和y坐标。
每个元素都有一个由高度和宽度定义的尺寸。这些值通过`size`方法获得,该方法给出元素的高度和宽度。
现在开始裁剪图像。
# to get the axes ax = location['x']; ay = location['y']; width = location['x']+size['width']; height = location['y']+size['height']; # to compute the cropped image dimension cropImage = Image.open('screenshot_t.png') cropImage = cropImage.crop((int(ax), int(ay), int(width), int(height))) cropImage.save('cropImage.png')
示例
捕获特定元素截图的代码实现。
from selenium import webdriver from PIL import Image #browser exposes an executable file #Through Selenium test we will invoke the executable file which will then #invoke actual browser driver = webdriver.Chrome(executable_path="C:\chromedriver.exe") # to maximize the browser window driver.maximize_window() #get method to launch the URL driver.get("https://tutorialspoint.com/index.htm") #to refresh the browser driver.refresh() # identifying the element to capture the screenshot s= driver.find_element_by_xpath("//input[@class='gsc-input']") # to get the element location location = s.location # to get the dimension the element size = s.size #to get the screenshot of complete page driver.save_screenshot("screenshot_tutorialspoint.png") #to get the x axis x = location['x'] #to get the y axis y = location['y'] # to get the length the element height = location['y']+size['height'] # to get the width the element width = location['x']+size['width'] # to open the captured image imgOpen = Image.open("screenshot_tutorialspoint.png") # to crop the captured image to size of that element imgOpen = imgOpen.crop((int(x), int(y), int(width), int(height))) # to save the cropped image imgOpen.save("screenshot_tutorialspoint.png") #to close the browser driver.close()
广告