我正在使用Protractor进行测试自动化。我使用Protractor(jasmine)和Appium完美地测试了我的混合Android应用程序。但我无法使browser.takeScreenshot()
功能正常工作。所有其他测试工作完全像点击按钮或类似的东西。
我创建了一个新的空白应用程序,以排除插件导致此问题。没有Cordova插件阻止屏幕截图功能,我可以使用Android设备本身截取屏幕截图
我尝试了这个StackOverflow答案(以及更多),但没有成功(似乎没有人经历过这个问题)。
我还使用了protractor-jasmin2-screenshot-reporter来排除我拍摄截图的代码不起作用,但我得到了相同的结果。令人沮丧的是,当我使用browserName:'Chrome'并让测试在我的设备上打开Chrome并致电www.google.com并让我的代码截取屏幕截图时,它运行正常。仅在我的混合应用程序中,截取屏幕截图不起作用
(browser.takeScreenshot().then(function (png) {...
代码来自官方量角器页面和其他可靠来源)。
exports.config = {
seleniumAddress : 'http://localhost:4723/wd/hub',
// Reference: https://github.com/appium/sample-code/blob/master/sample-code/examples/node/helpers/caps.js
capabilities : {
// needed by local appium
platformVersion : '',
platformName : '',
deviceName : '',
// needed by protractor
browserName : '',
autoWebview : true,
// CHANGE THIS TO YOUR ABSOLUTE PATH OR SET IT IN APPIUM CLIENT
app : 'C:/Projekte/WifiWizardTestApp/platforms/android/build/outputs/apk/android-debug.apk',
newCommandTimeout : 60
},
//needed for local appium
baseUrl : 'http://localhost:8080',
//configuring wd in onPrepare
//wdBridge helps to bridge wd driver with other selenium clients
//See https://github.com/sebv/wd-bridge/blob/master/README.md
onPrepare : function () {
var wd = require('wd');
var protractor = require('protractor');
var wdBridge = require('wd-bridge')(protractor, wd);
wdBridge.initFromProtractor(exports.config);
},
};
var fs = require('fs');
describe('Testing the browse state', function () {
it('should be able to take a screenshot', function (done) {
browser.sleep(2000);
browser.takeScreenshot().then(function (png) {
console.log('browser.takeScreenshot()');
var stream = fs.createWriteStream('screenshot.png');
stream.write(new Buffer(png, 'base64'));
stream.end();
done();
});
});
it('should be able to take an other screenshot', function () {
browser.takeScreenshot().then(function (png) {
console.log('browser.takeScreenshot()');
var stream = fs.createWriteStream('screenshot2.png');
stream.write(new Buffer(png, 'base64'));
stream.end();
});
});
});
C:\Projekte\WifiWizardTestApp>protractor protractor.config.js --specs tests/browse.spec.js
[09:27:44] I/hosted - Using the selenium server at http://localhost:4723/wd/hub
[09:27:44] I/launcher - Running 1 instances of WebDriver
Started
A Jasmine spec timed out. Resetting the WebDriver Control Flow.
FA Jasmine spec timed out. Resetting the WebDriver Control Flow.
F
Failures:
1) Testing the browse state should be able to take a screenshot
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5)
2) Testing the browse state should be able to take an other screenshot
Message:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5)
2 specs, 2 failures
Finished in 60.04 seconds
C:\Projekte\WifiWizardTestApp>protractor protractor.config.js --specs tests/browse.spec.js
[15:15:49] I/hosted - Using the selenium server at http://localhost:4723/wd/hub
[15:15:49] I/launcher - Running 1 instances of WebDriver
Started
FF
Failures:
1) Testing the browse state should be able to take a screenshot
Message:
Failed: unknown error: unhandled inspector error: {"code":-32603,"message":"Unable to capture screenshot"}
(Session info: webview=30.0.0.0)
(Driver info: chromedriver=2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform=Windows NT 10.0.10586 x86_64)
Stack:
WebDriverError: unknown error: unhandled inspector error: {"code":-32603,"message":"Unable to capture screenshot"}
(Session info: webview=30.0.0.0)
(Driver info: chromedriver=2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform=Windows NT 10.0.10586 x86_64)
at WebDriverError (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:27:5)
at Object.checkLegacyResponse (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:505:15)
at parseHttpResponse (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\http.js:509:13)
at doSend.then.response (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\http.js:440:13)
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.takeScreenshot()
at WebDriver.schedule (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:816:17)
at WebDriver.takeScreenshot (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:1092:17)
at ProtractorBrowser.to.(anonymous function) [as takeScreenshot] (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\lib\browser.ts:94:25)
at Object.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:14:17)
at C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:98:15
at new ManagedPromise (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1067:7)
at controlFlowExecute (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:87:18)
at TaskQueue.execute_ (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2970:14)
at TaskQueue.executeNext_ (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2953:27)
at asyncRun (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2813:27)
From: Task: Run it("should be able to take a screenshot") in control flow
at Object.<anonymous> (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:86:14)
From asynchronous test:
Error
at Suite.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:8:5)
at Object.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:4:1)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
2) Testing the browse state should be able to take an other screenshot
Message:
Failed: unknown error: unhandled inspector error: {"code":-32603,"message":"Unable to capture screenshot"}
(Session info: webview=30.0.0.0)
(Driver info: chromedriver=2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform=Windows NT 10.0.10586 x86_64)
Stack:
WebDriverError: unknown error: unhandled inspector error: {"code":-32603,"message":"Unable to capture screenshot"}
(Session info: webview=30.0.0.0)
(Driver info: chromedriver=2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform=Windows NT 10.0.10586 x86_64)
at WebDriverError (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:27:5)
at Object.checkLegacyResponse (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\error.js:505:15)
at parseHttpResponse (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\http.js:509:13)
at doSend.then.response (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\http.js:440:13)
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.takeScreenshot()
at WebDriver.schedule (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:816:17)
at WebDriver.takeScreenshot (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver.js:1092:17)
at ProtractorBrowser.to.(anonymous function) [as takeScreenshot] (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\lib\browser.ts:94:25)
at Object.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:26:17)
at C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:102:25
at new ManagedPromise (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1067:7)
at controlFlowExecute (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:87:18)
at TaskQueue.execute_ (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2970:14)
at TaskQueue.executeNext_ (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2953:27)
at asyncRun (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2860:25)
From: Task: Run it("should be able to take an other screenshot") in control flow
at Object.<anonymous> (C:\Users\mkaiser\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd2\index.js:86:14)
From asynchronous test:
Error
at Suite.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:24:5)
at Object.<anonymous> (C:\Projekte\WifiWizardTestApp\tests\browse.spec.js:4:1)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
2 specs, 2 failures
Finished in 2.258 seconds
[15:17:49] I/launcher - 0 instance(s) of WebDriver still running
[15:17:49] I/launcher - #01 failed 2 test(s)
[15:17:49] I/launcher - overall: 2 failed spec(s)
[15:17:49] E/launcher - Process exited with error code 1
答案 0 :(得分:1)
wdBrowser.context('NATIVE_APP').then(() => {
browser.takeScreenshot().then(function (png) {
console.log('browser.takeScreenshot()');
var stream = fs.createWriteStream('screenshot.png');
stream.write(new Buffer(png, 'base64'));
stream.end(function(){
wdBrowser.context(<Your webview>).then(done);
});
})
});
其中wdBrowser是由wdBridge设置的全局变量。应该工作 - 有类似的问题(无法截取屏幕截图,但没有像你一样的错误信息)
您可以从appium日志中获取您的webview名称/ ID。
答案 1 :(得分:1)
wdBrowser.context('NATIVE_APP')
对我不起作用。
它拍了照片,但之后每个测试用例都失败了。
我找到了一个不同的解决方案来截取屏幕截图
我用以下代码替换了takeScreenshots()方法:
var exec = require('child_process').exec;
exec('adb shell /system/bin/screencap -p /sdcard/' + filename); // Take a screenshot and store it on the internal storage.
// Wait until the screenshot is created on android
var date = new Date();
var curDate = null;
do {
curDate = new Date();
}
while (curDate - date < 1000);
var command = 'adb pull /sdcard/'+ filename + ' ' + screenshotPath;
exec(command, function (err, stdout, stderr) { // Copy the screenshot from the internal storage to the local computer.
if(err){
console.error('The screenshot could not be copied from the ANDROID device: ' + stdout);
console.log('The screenshot is stored on the ANDROID device with the name: ' + filename);
}
});
我有以下问题: