WebDriver:TakeScreenshot returns empty string
Categories
(Remote Protocol :: Marionette, defect, P3)
Tracking
(Not tracked)
People
(Reporter: aclvaz, Unassigned)
References
(Blocks 1 open bug)
Details
User Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36 Steps to reproduce: using Selenium in C#: return ((ITakesScreenshot)_driver).GetScreenshot(); for a WebDriver configured like this: private void CreateWebDriver() { FirefoxProfile customProfile = new FirefoxProfile(); customProfile.SetPreference("dom.disable_beforeunload", true); // disable want to leave page question. customProfile.SetPreference("full-screen-api.approval-required", false); // disable maximize firefox question customProfile.SetPreference("network.http.connection-timeout", 25); // connection time-out. customProfile.SetPreference("dom.max_chrome_script_run_time", 0); customProfile.SetPreference("dom.max_script_run_time", 0); // for some pesky sites customProfile.SetPreference("browser.download.folderList", 2); customProfile.SetPreference("browser.download.dir", Directory.GetCurrentDirectory()); customProfile.SetPreference("browser.helperApps.neverAsk.saveToDisk", "text/vnd.wap.wml,application/x-trash,httpd/unix-directory,application/vnd.framemaker,application/octet-stream"); // ex: dgj.com, yld.com, zpo.com?, cwb.net, kuke.com customProfile.SetPreference("media.volume_scale", "0.0"); customProfile.SetPreference("dom.successive_dialog_time_limit", 1); FirefoxOptions fo = new FirefoxOptions(); fo.Profile = customProfile; fo.SetPreference("security.sandbox.content.level", 5); fo.AddAdditionalCapability("acceptInsecureCerts", true, true); fo.AcceptInsecureCertificates = true; fo.Profile.AcceptUntrustedCertificates = true; fo.Profile.AssumeUntrustedCertificateIssuer = true; fo.Profile.DeleteAfterUse = true; fo.UnhandledPromptBehavior = UnhandledPromptBehavior.Dismiss; fo.LogLevel = FirefoxDriverLogLevel.Trace; fo.SetPreference("webdriver.log.file", "d:\\selenium\\driver.log"); _driver = new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), fo, TimeSpan.FromSeconds(60)); _driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(40); } accessing URL www.ypl.com (or www.pbo.com, or www.mjl.com, etc) gets an empty string. using: * GeckoDriver Version: 0.21.0 * Platform: Windows 7 Enterprise Edition 64 bits * Firefox: 59.0.2 (64-bit) * Selenium: 3.12.1 Actual results: got an empty string on Selenium where there should be a base64 encoded string with the web page image: 1530016396134 webdriver::server DEBUG -> POST /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/window/rect {"width":1024,"height":768} 1530016396141 webdriver::server DEBUG <- 200 OK {"value": {"height":768,"width":1024,"x":4,"y":4}} 1530016396142 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/window 1530016396147 webdriver::server DEBUG <- 200 OK {"value":"4294967297"} 1530016396626 webdriver::server DEBUG -> POST /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/url {"url":"http://www.ypl.com"} 1530016397592 webdriver::server DEBUG <- 200 OK {"value": null} 1530016398311 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/alert/text 1530016398315 webdriver::server DEBUG <- 404 Not Found {"value":{"error":"no such alert","message":"No modal dialog is currently open","stac ktrace":"WebDriverError@chrome://marionette/content/error.js:178:5\nNoSuchAlertError@chrome://marionette/content/error.js:423:5\nGeckoDriver.prototype ._checkIfAlertIsPresent@chrome://marionette/content/driver.js:3197:11\nGeckoDriver.prototype.getTextFromDialog@chrome://marionette/content/driver.js:3 160:3\ndespatch@chrome://marionette/content/server.js:293:20\nexecute@chrome://marionette/content/server.js:267:11\nonPacket/<@chrome://marionette/con tent/server.js:242:15\nonPacket@chrome://marionette/content/server.js:241:8\n_onJSONObjectReady/<@chrome://marionette/content/transport.js:500:9\n"}} 1530016399054 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/window/handles 1530016399057 webdriver::server DEBUG <- 200 OK {"value":["4294967297"]} 1530016399103 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/window/handles 1530016399107 webdriver::server DEBUG <- 200 OK {"value":["4294967297"]} 1530016399749 webdriver::server DEBUG -> POST /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/execute/sync {"script":"return (document.readySt ate == 'complete' && ((window.jQuery === undefined) || jQuery.active == 0))","args":[]} 1530016399759 webdriver::server DEBUG <- 200 OK {"value":true} 1530016400485 webdriver::server DEBUG -> POST /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/elements {"using":"xpath","value":"//meta[@http- equiv='refresh']"} 1530016400492 webdriver::server DEBUG <- 200 OK {"value":[]} 1530016407499 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/url 1530016407502 webdriver::server DEBUG <- 200 OK {"value":"http://www.ypl.com/"} 1530016407542 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/url 1530016407545 webdriver::server DEBUG <- 200 OK {"value":"http://www.ypl.com/"} 1530016433263 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/screenshot 1530016433275 webdriver::server DEBUG <- 200 OK {"value":""} 1530016433275 webdriver::server DEBUG -> GET /session/01e446d4-a1f6-47db-8958-bd6a9ffbbc83/url 1530016433278 webdriver::server DEBUG <- 200 OK {"value":"http://www.ypl.com/"} Expected results: should have returned a base64 encoded string with the snapshot image
Comment 1•6 years ago
|
||
Triaging this issue to testing::geeckodriver as it seems to me the correct component.
Comment 2•6 years ago
|
||
This is an issue with Marionette. We will have to look into it at some point. Tonecas, if you want to help us investigating please let us know.
Comment 3•6 years ago
|
||
From Andreas via the Github issue:
> That said, the return value from takeScreenshot is an empty string, which we would not expect for https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg. I expect there is an issue somewhere dealing with the correct document type, since the document is an XML file.
(In reply to Henrik Skupin (:whimboo) from comment #2) > This is an issue with Marionette. We will have to look into it at some > point. > > Tonecas, if you want to help us investigating please let us know. Yes I can help if I can. I am not familiarized how to debug Mozilla code from another project (in my case, my own code and Selenium code). I use Visual Studio and i'm using ReSharper to help bind external code to a project, but did not get yet on how to be able to make breakpoints on Geckodriver/Marionette code. if you have any info/help page on this I surely can make a more in depth debug.
Comment 5•6 years ago
|
||
I would propose that you read through the following document first: https://firefox-source-docs.mozilla.org/testing/marionette/marionette/NewContributors.html Once done feel free to contact me or Andreas (ato) in the #ateam channel. We are happy to help further! Also thank you for your interest to help.
Comment 6•6 years ago
|
||
I haven’t been able to confirm yet if this is related to the GitHub
issue quoted, as that is specifically about XHTML/XML documents.
This is an HTML document which appears to exhibit the same problem.
Perhaps my initial suspicion was wrong.
In any case, I reproduced this with the Marionette client against
Nightly:
> >>> m.navigate("http://www.ypl.com")
> 1530629481160 Marionette TRACE 0 -> [0,2,"WebDriver:Navigate",{"url":"http://www.ypl.com"}]
> 1530629481170 Marionette DEBUG [7] Received DOM event beforeunload for about:blank
> 1530629481473 Marionette DEBUG [7] Received DOM event pagehide for about:blank
> 1530629481524 Marionette DEBUG [7] Received DOM event DOMContentLoaded for http://www.ypl.com/
> 1530629481784 Marionette DEBUG [7] Received DOM event pageshow for http://www.ypl.com/
> 1530629481802 Marionette TRACE 0 <- [1,2,null,{"value":null}]
> >>> m.screenshot()
> 1530629487629 Marionette TRACE 0 -> [0,3,"WebDriver:TakeScreenshot",{"highlights":null,"full":true,"hash":false,"id":null,"scroll":true}]
> u''
> >>> 1530629487636 Marionette TRACE 0 <- [1,3,null,{"value":""}]
Comment 8•5 years ago
|
||
Also happening on http://creppy.hu/.
Comment 9•5 years ago
|
||
Quoting Sule Tamas over on https://bugzilla.mozilla.org/show_bug.cgi?id=1500117: (In reply to Sule Tamas from comment #2) > The bug can be reproduced with the following code on a local html file: > > <!DOCTYPE html> > <html> > <head> > <style> > body { > margin: 0 > } > </style> > </head> > <body></body> > </html>
Comment 10•5 years ago
|
||
I feel that this should be the same underlying issue as I have described on bug 1492357 comment 1.
Comment 11•5 years ago
|
||
I compiled a nightly from source and tracked the issue i mentioned before. I solved my problem and created a workaround. in /mozilla-unified/testing/marionette/listener.js: in function takeScreenshot: if the "full" flag has true value "win.document.documentElement" is passed to the capture.element function. in /mozilla-unified/testing/marionette/capture.js in function capture.element The necessary dimensions for the rendering are queried by node.getBoundingClientRect() where node is the passed "win.document.documentElement". Of course the size object returned contains zero height. I found out this works ok for any element, except for win.document.documentElement if the document has 0 height. http://creppy.hu/ and some other websites uses one absolute positioned div in the body, so the body and the documentElement has zero height. While trying to get a correct solution, i checked the inbuilt screenshot function (right click menu: take screenshot) in /mozilla-unified/browser/extensions/screenshots/selector/uicontrol.js following functions are used to determine the correct size when the user selects full screen screenshot: function getDocumentWidth() { return Math.max( document.body && document.body.clientWidth, document.documentElement.clientWidth, document.body && document.body.scrollWidth, document.documentElement.scrollWidth); } function getDocumentHeight() { return Math.max( document.body && document.body.clientHeight, document.documentElement.clientHeight, document.body && document.body.scrollHeight, document.documentElement.scrollHeight); } So, my suggested solution is: in /mozilla-unified/testing/marionette/capture.js in function capture.element Adding a condition helped me: capture.element = function(node, highlights = []) { let win = node.ownerGlobal; console.log(node); let rect = node.getBoundingClientRect(); if (win.document.documentElement === node) { rect.height=Math.max(win.document.body && win.document.body.scrollHeight,win.document.documentElement.scrollHeight); rect.width=Math.max(win.document.body && win.document.body.scrollWidth,win.document.documentElement.scrollWidth); } return capture.canvas( win, rect.left, rect.top, rect.width, rect.height, {highlights}); }; I'm not familiar with mozilla related codes. Please, check my suggestion.
Comment 12•5 years ago
|
||
Sule, thanks a lot for the proposed fix! I know that you aren't familiar with the code, but would you feel confident enough, and have interest to maybe try to fix it yourself when I mentor you through the whole process? I would really like doing that if you are up for it.
Comment 13•5 years ago
|
||
Sorry for the late answer, i am working on a full time company project. I'm still interested in solving this problem. If my other project allows some free time, i will contact on irc. Merry Christmas, suletom
Comment 14•5 years ago
|
||
Thank you very much Sule and Henrik. I also experience this problem at different websites that rely on absolute positioned divs. Best regards, Kees
1547028339137 Marionette TRACE 0 -> [0,4,"WebDriver:ExecuteScript",{"args":[],"newSandbox":false,"script":"return document.readyState","specialPowers":false}]
1547028339139 Marionette TRACE 0 <- [1,4,null,{"value":"complete"}]
1547028339139 webdriver::server DEBUG <- 200 OK {"value":"complete"}
1547028339142 webdriver::server DEBUG -> GET /session/e05d0cee-6db5-4aa2-ae00-7ee75a4a1a0e/screenshot
1547028339143 Marionette TRACE 0 -> [0,5,"WebDriver:TakeScreenshot",{"full":false,"highlights":[],"id":null}]
1547028339145 Marionette TRACE 0 <- [1,5,null,{"value":""}]
1547028339145 webdriver::server DEBUG <- 200 OK {"value":""}
Updated•1 year ago
|
Updated•10 months ago
|
Description
•