首页 > 解决方案 > 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.netseleniumcanvassave

解决方案


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")

推荐阅读