几天来我一直在尝试使用 Selenium 和不同的裁剪方法来裁剪特定的图像。
在我的代码之前有一个重要的说明 - 以下方法在两周前曾经有效,由于某种原因它现在返回一个坐标错误的图像
// Go to site
Driver.Navigate().GoToUrl("http://google.com");
Screenshot screenshot = driver.GetScreenshot();
using (var ms = new MemoryStream(screenshot.AsByteArray))
using (var imgShot = Image.FromStream(ms))
using (var src = new Bitmap(imgShot))
{
IWebElement element = driver.FindElement(By.XPath("//canvas"));
Rectangle cropRect = new Rectangle(element.Location.X, element.Location.Y, element.Size.Width, element.Size.Height);
var clone = src.Clone(cropRect, src.PixelFormat);
clone.Save(filePath);
}
我尝试过的事情:
1)我通常使用 Firefox 驱动程序来实现此目的,我尝试使用 ChromeDriver 代替并得到相同的结果。
2)我使用以下控制台命令检查元素坐标:$0.getBoundingClientRect(),并且我在代码中获得的位置与其匹配。
3)我尝试了 4 种不同的裁剪方法,包括这个:
IWebElement element = Driver.FindElement(By.XPath("//canvas"));
string filename = @"C:\Users\User\Desktop\test.png";
Screenshot screenshot = Driver.GetScreenshot();
screenshot.SaveAsFile(filename, ImageFormat.Png);
Rectangle cropRect = new Rectangle(element.Location.X, element.Location.Y,
element.Size.Width, element.Size.Height);
using (Image imgShot = Image.FromFile(filename))
using (Bitmap original = new Bitmap(imgShot))
using (Bitmap target = new Bitmap(original, new Size(cropRect.Width, cropRect.Height)))
using (Graphics g = Graphics.FromImage(target))
{
g.DrawImage(original, new Rectangle(0, 0, target.Width, target.Height),
cropRect,
GraphicsUnit.Pixel);
target.Save(@"C:\Users\User\Desktop\test1.png", ImageFormat.Png);
}
需要明确的是,我得到的图像完全是空白的。在另一个网站上,我得到的图像不是空白的,所以我可以看出它只是在错误的坐标中。
4)我尝试了不同的网站和不同的元素,但它们的坐标都是错误的。
5)我尝试用谷歌搜索,发现很多不同的方法都行不通。这answer https://stackoverflow.com/a/26649763/3450204然而,说了一些关于分辨率的事情,这是我最好的猜测。我尝试使用原始分辨率和目标分辨率,没有发现任何差异。在创建 Graphics 变量之前或之后调用设置分辨率方法,并且仍然为零变化。
有趣的是,它在两周前可以工作,但我从未更改过代码......