Selenium VB.Net 2019保存画布图像

Selenium VB.Net 2019保存画布图像,vb.net,selenium,canvas,save,Vb.net,Selenium,Canvas,Save,梅米特·梅切克 我正在尝试使用Selenium VB.net 2019保存标记的图像。我的操作代码是 Dim ele = driver.FindElementByClassName("canvasWrapper") Dim base64string = Trycast(driver.ExecuteScript(" var c = document.createElement('canvas'); var ctx =

梅米特·梅切克

我正在尝试使用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
基本上是一个
计数器
,用作每个保存图像的文件名。唯一的缺点是所有文件都下载到
默认下载文件夹

我可以使用的第三种方法是

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)
FileCopy(My.Application.Info.DirectoryPath & "\css\viewer.css", Path & "\" & "viewer.css")