【发布时间】:2017-07-19 20:07:10
【问题描述】:
我的测试需要与画布中加载的图像进行交互。
但我不知道如何实现加载图像的等待。 如果我希望只有画布测试开始与它交互,而图像仍在加载。
我必须使用 driver.sleep(),但这是一个糟糕且不可靠的解决方案。 有一部分页面代码用画布:
<canvas class='ol-unselectable' width='816' height='400' style='width: 100%; height: 100%;'></canvas>
此外,应用程序是用 Angular 编写的。
浏览器开发者控制台中的Network标签显示在加载图片的时候是Img请求。
我认为,可以编写一些代码来检查在浏览器中将图像加载到画布中并通过js执行器使用它。
但我不知道该怎么做。请帮帮我。
UPD。我尝试构建自定义等待条件:
exports.isAllImageLoad = function isAllImageLoad(driver) {
return new Condition('image loading', function(driver) {
return driver.executeScript(
'var img = new Image();' +
'img.onload = function() { return true; };' +
'img.onload()'
).then(function(result) {
console.log('image loading: ' + result);
return result;
});
});
};
并将其用于:
return driver.wait(isAllImageLoad(driver), waitTimeOut);
但是控制台告诉我img.onload() 的结果是null。
UPD.我尝试使用此代码:
exports.isAllImageLoad = function isAllImageLoad(driver) {
return new Condition('image loading', function(driver) {
return driver.executeScript(
'var image = new Image();' +
'function mainLoop(){' +
'if(image.complete){' +
'return true;' +
'}else{' +
'return false;' +
'}' +
'}' +
'mainLoop();'
).then(function(result) {
console.log('image loading: ' + result);
return result;
});
});
};
但同样返回null。
【问题讨论】:
-
感谢您的回复。所有解决方案都建议使用图片 url,但事实是图片加载不同,取决于用户之前的操作。
-
我尝试构建自定义等待条件:
exports.isAllImageLoad = function isAllImageLoad(driver) { return new Condition('image loading', function(driver) { return driver.executeScript( 'var img = new Image();' + 'img.onload = function() { return true; };' + 'img.onload()' ).then(function(result) { console.log('image loading: ' + result); return result; }); }); };并将其用于:return driver.wait(isAllImageLoad(driver), waitTimeOut);但控制台显示结果为null。
标签: javascript angularjs html canvas selenium-webdriver