我需要与画布中加载的图像进行交互。
但是我不知道如何实现等待图像加载。如果我只期望画布测试在图像加载时开始与其交互,那么该怎么办?
我必须使用driver.sleep(),但这是一个不好且不可靠的解决方案。以下是页面代码的一部分:
<canvas class='ol-unselectable' width='816' height='400' style='width: 100%; height: 100%;'></canvas>
另外,该应用程序是使用Angular编写的。
浏览器中的开发人员控制台中的Network选项卡显示,在加载图像时会发出Img请求。
我认为可以编写一些代码来检查在浏览器中将图像加载到画布中并通过js执行程序使用它。
但我不知道如何做。请帮帮我。
更新:我尝试构建自定义等待条件:
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
。
更新。我尝试使用以下代码:
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
。
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
。 - Valentina