2016-05-31 30 views
4

在量角器中,我需要打开一个具有画布的非角度页面,它将填充图像。然后我需要操纵图像并做一个截图比较。但是,我的问题是让测试等待图像加载。如果我使用状态,以等待元素即量角器:等待图像加载到画布上

browser.wait(expectedConditions.visibilityOf(element(by.tagName('canvas'), 20000); 

browser.wait(expectedConditions.presenceOf(element(by.tagName('canvas'), 20000); 

出席或可见,画布元素存在,且可见,但图像仍在加载进去,这样的形象截图比较失败通常在发生时加载一半。我可以通过在代码中插入大量browser.sleep(20000)语句来确保图像完全加载,但这太糟糕了。

有没有人知道一种方法来使量角器等待,直到图像完成加载之前继续?或者至少有一个更好的做法呢?

感谢

+0

试着听听您所加载的画布图像(onload事件),而是比canvas元素本身...... [HTML5 Canvas Image Tutorial](http://www.html5canvastutorials.com/tutorials/html5-canvas-images/) –

+0

好的,这听起来不错,但教程并没有真正帮助我从量角器钩入画布图像,怎么做我这样做?似乎没有什么办法可以抓住它,我可以找到? – user3075259

+0

您可以比较,直到var'c = document.getElementById(“myCanvas”); c.toDataURL();'返回相同的2次或3次只是一个想法,可能是一个工作或更好地给你的想法......我现在还没有一个确切的答案。 –

回答

1

您可以通过具有定制的预期条件解决它。我想你可以使用一个画布getImageData()方法并等待它是truthy(未测试):

function waitForCanvasToLoad(elm) { 
    return function() { 
     return browser.executeScript("!!arguments[0].getImageData();", elm.getWebElement()); 
    } 
} 

var canvas = element(by.tagName('canvas')); 
browser.wait(waitForCanvasToLoad(elm), 5000); 
+0

很酷,看起来像是可以工作,但它给了我一个内存不足的错误,我会有一个谷歌周围,但如果你有任何建议,他们将非常感谢。 – user3075259

+0

@ user3075259我已将修复应用于代码(忘记调用'getWebElement()'),看看它是否有帮助。另外,玩弄你在画布上调用的东西 - 例如尝试'数据'而不是'getImageData()'.. – alecxe

+0

这效果更好,我现在没有看到任何内存问题,但它也没有返回任何东西,只是超时。我已经尝试过几乎所有我可以回来的东西。 – user3075259

0

你可以等待编码画布是略低于预期的长度:

var canvas = element(by.tagName('canvas')); 
browser.wait(EC.presenceOf(canvas), 6000); 

// wait for the encoded length to be over 2500 (must be adjusted depending on the canvas) 
browser.wait(() => browser.executeScript(
    (e) => e.toDataURL().length > 2500 
    , canvas.getWebElement()), 6000); 

你也可以等到最后一个像素进行设置,如果颜色不是黑色:

var canvas = element(by.tagName('canvas')); 
browser.wait(EC.presenceOf(canvas), 6000); 

// wait for the last pixel to be set (not black) 
browser.wait(() => browser.executeScript(
    (e) => [].some.call(e.getContext('2d').getImageData(e.width, e.height, 1, 1), Math.abs) 
    , canvas.getWebElement()), 6000); 
+0

谢谢,这几乎看起来像会起作用,但最终不会令人讨厌,画布在完成绘制之前获取完整的dataURL。看起来我被browser.sleep困住了。 – user3075259

+0

在测试上下文中,我将计算画布的哈希代码,并等待直到期望的哈希返回或超时。 –