vb.net - Selenium VB.Net 2019 保存画布图像
问题描述
使用mehmet mecek在此链接中给出的代码
我正在尝试使用 Selenium VB.net 2019 保存标签的图像。我执行此操作的代码是
Dim ele = driver.FindElementByClassName("canvasWrapper")
Dim base64string = Trycast(driver.ExecuteScript("
var c = document.createElement('canvas');
var ctx = c.getContext('2d');
var img = document.getElementById('page1');
c.height=img.naturalHeight;
c.width=img.naturalWidth;
ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);
var base64String = c.toDataURL();
return base64String;
"), String)
MsgBox(base64string.ToString())
Dim base64 = base64string.Split(",").Last()
Dim stream = New MemoryStream(Convert.FromBase64String(base64))
Dim bmCaptured As Bitmap = New Bitmap(stream)
bmCaptured.Save(Path + "\" + pageNum.ToString + ".jpg", Imaging.ImageFormat.Jpeg)
我收到错误“输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。我尝试过使用和不使用 Trycast,但无法保存画布,但不断出现一些错误。
解决方案
VB.Net 代码 - 明白了......但正在尝试更多解决方法
Dim bmpScreen As Screenshot = driver.GetScreenshot()
Dim scrshot As String= bmpScreen.AsBase64EncodedString
Dim screenshotAsByteArray As Byte() = bmpScreen.AsByteArray
bmpScreen.SaveAsFile(Path + "\" + pageNum.ToString + ".jpg",
System.Drawing.Imaging.ImageFormat.Jpeg)
在此之后,我们可以再次加载图像并裁剪为元素大小。
我可以搜索和开发的另一个最佳方法代码片段如下,并且运行良好
Dim fileName = pageNum.ToString + ".png"
Dim jsExeString As String = "var element = document.createElement('a');
element.setAttribute('href',
document.getElementById('page1').toDataURL('image/png'));
element.setAttribute('download', '" + fileName + "');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);"
driver.ExecuteScript(jsExeString)
pagenum
基本上是Counter
用作每个保存图像的文件名。唯一的缺点是所有文件都下载到Default Download Folder
.
第三种方法,我可以使用是
Dim ele = driver.FindElementById("mainContainer")
Dim stringForFile = "<!DOCTYPE html><html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<meta charset='UTF-8'/>
<meta name='viewport' content='width=device-width; initial-scale=1.0; user-scalable=no'/>
<meta content='notranslate' name='google'/>
<meta http-equiv='X-UA-Compatible' content='IE=edge'/>
<link rel='stylesheet' href='.\viewer.css' type='text/css'>
<link rel='stylesheet' href='.\book.css' type='text/css'>
<link rel='stylesheet' href='.\stick.css' type='text/css'>
<link rel='stylesheet' href='.\template.css' type='text/css'>
<link rel='stylesheet' href='.\media-queries.css' type='text/css'>
<link rel='stylesheet' href='.\styles.css' type='text/css'>
<link rel='stylesheet' href='.\jquery-ui.css' type='text/css'>
<link rel='stylesheet' type='text/css' href='.\jquery.fancybox.css' media='screen' />
<script src='.\jspdf.js'></script>
<script src='.\from_html.js'></script>
<script src='.\split_text_to_size.js'></script>
<script src='.\standard_fonts_metrics.js'></script>
</head><body>" &
ele.GetAttribute("innerHTML") &
"</body></html>"
File.WriteAllText(Path + "\" + pageNum.ToString + ".htm", stringForFile)
可以使用这样的语句将所有.css
和.js
文件复制到Path
(定义目标文件夹的变量)
FileCopy(My.Application.Info.DirectoryPath & "\css\viewer.css", Path & "\" & "viewer.css")
推荐阅读
- arduino - 液晶屏显示随机字符
- javascript - 如何使用 CSS 和 Javascript 在我的菜单导航栏中添加动画
- node.js - 如何在 node.js 中使用 typescript 从 express 获取 GET 参数?
- google-bigquery - How to make multiple BigQuery JSON_EXTRACT fields efficient?
- javascript - How do I run a javascript command in WKWebView Swift
- regex - `{1}` 在正则表达式中有什么不同吗?
- algorithm - How to generate a random character that is either a number or an alphabetic letter in pseudo-code
- javascript - gulp-autoprefixer problem using gulp, sass and css files not linking
- javascript - Sending a JSON POST request from aws Lambda Function to a REST API
- google-sheets - Return Multiple values by vlookup and importrange