java - Ashot 屏幕截图无法正确裁剪屏幕截图中的元素
问题描述
我正在尝试打开此 url并使用Ashot 库截取“继续浏览”按钮的屏幕截图,如下图所示。
这是我对 pom.xml 的依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>ru.yandex.qatools.ashot</groupId>
<artifactId>ashot</artifactId>
<version>1.5.4</version>
</dependency>
</dependencies>
这是我的代码:
public class Main {
public static void main(String[] args) throws InterruptedException, IOException {
System.setProperty("webdriver.chrome.driver", "C:\\selenium-driver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
String baseUrl = "https://www.immoweb.be/en/search/house/for-sale?countries=BE&page=1&orderBy=relevance";
driver.get(baseUrl);
Thread.sleep(3000);
WebElement element = driver.findElement(By.xpath("//*[@id='uc-btn-accept-banner']"));
Screenshot screenshot = new AShot().coordsProvider(new WebDriverCoordsProvider())
.takeScreenshot(driver, element);
File actualFile = new File("C:\\baseImage\\dashboardActual.png");
ImageIO.write(screenshot.getImage(), "png", actualFile);
driver.close();
}
}
但是当我执行代码时,截取的屏幕截图不正确。
这是我的截图:
更新:阅读此问题后,我添加了同样无济于事的shootingStartegy:
Screenshot screenshot =
new AShot()
.shootingStrategy(ShootingStrategies.viewportPasting(100))
.coordsProvider(new WebDriverCoordsProvider())
.takeScreenshot(driver, element);
解决方案
我认为,Ashot 库没有足够的文档。但是,您不需要 AShot 来截取元素的屏幕截图,但您需要它来比较两个不同的图像。这是我建议的解决方案:
public static String URL = "https://www.immoweb.be/en/search/house/for-sale?countries=BE&page=1&orderBy=relevance";
// Notice that the ELEMENT_ID might change as the website is dynamic
public static String ELEMENT_ID = "//article[@id='classified_9408324']";
public static String BUTTON_ID = "//*[@id='uc-btn-accept-banner']";
public static int DELAY_IN_MILLI_SECONDS = 5000;
System.setProperty("webdriver.chrome.driver", "C:\\selenium-driver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get(URL);
Thread.sleep(DELAY_IN_MILLI_SECONDS);
driver.findElement(By.xpath(BUTTON_ID)).click();
WebElement element = driver.findElement(By.xpath(ELEMENT_ID));
File actualFile = element.getScreenshotAs(OutputType.FILE);
BufferedImage actualImage = ImageIO.read(actualFile);
FileUtils.copyFile(actualFile, new File("C:\\baseImage\\dashboardActual.png"));
File expectedFile = new File("C:\\baseImage\\6.png");
BufferedImage expectedImage = ImageIO.read(expectedFile);
// Compare two images for visual testing
ImageDiff diff = new ImageDiffer().makeDiff(actualImage, expectedImage);
BufferedImage diffImage = diff.getMarkedImage();
File diffFile = new File("C:\\baseImage\\Diff.png");
ImageIO.write(diffImage, "jpg", diffFile);
Assert.assertFalse("Images are not equal",diff.hasDiff());
driver.close();
因此,简而言之,Selenium 工作的以下行可以截取元素的屏幕截图,您可以将其用作视觉测试的基本图像:
WebElement element = driver.findElement(By.xpath(ELEMENT_ID));
File actualFile = element.getScreenshotAs(OutputType.FILE);
BufferedImage actualImage = ImageIO.read(actualFile);
FileUtils.copyFile(actualFile, new File("C:\\baseImage\\dashboardActual.png"));
这是图像:
推荐阅读
- python - 什么级别的预测(节点级别或图级别)适合我的图网络问题?
- mongodb - 使用 updateMany MongoDb 函数有什么缺点或限制吗?
- javascript - 代码同时运行(打字机效果)
- c# - SQLite syntax error inside of command: 'SQL logic error near "=": syntax error'
- spring - 如何在不更改编码的情况下使用 spring 返回文件,或者只设置 UTF-8-BOM 编码
- react-native - 将图像 url 作为参数传递给 react-navigation Deeplink
- prometheus - Grafana 自我指标和跟踪警报触发器
- gcc - /usr/bin/ld: 找不到 /usr/lib64/libpthread_nonshared.a
- java - 升级到 Gradle 7 后 Android Gradle Javadoc 损坏
- swift - 如何在 Swift 5.5 中将 List 中的新绑定与子项一起使用?