我怎么用behat做一个假签名

时间:2016-09-13 21:08:46

标签: php selenium bdd behat mink

Picture of tested code / Picture of working signature您好我正在使用与mink集成的selenium驱动程序,我正在尝试编写一个输入伪签名的测试。我们使用鼠标在屏幕上绘制签名,所以我希望能够让selenium为我做这件事。我尝试抓取字段的ID并使用dragTo('我的页面上的另一个元素'),但它只在签名框内单击并且不执行任何其他操作。

我正在使用的框架是用于php的laravel。

$field = $this->getSession()->getPage()->findById('ctlSignature);

$field->dragTo('another id on my page');

这不起作用。

如果我可以告诉鼠标点击,然后向右移动10个像素,然后再次单击,这将是完美的,因为我可以使用它来绘制签名。

感谢您的回复,但是当我运行此代码时出现错误,

$script = "var c = document.querySelector('#ctlSignature'); var ctx = c.getContext('2d'); ctx.moveTo(20,20); ctx.lineTo(50,50); ctx.stroke()";

$this->getSession()->evaluateScript($script);

发回错误意外的令牌变量。如果我尝试在字符串中使用它会发送另一个错误,说明意外的令牌

1 个答案:

答案 0 :(得分:1)

解决方案是使用可以使用evaluateScript或executeScript执行的javascript。

$this->getSession()->evaluateScript($script);

$ script变量是一个字符串,可以包含如下脚本:

var c = document.querySelector("canvas");
var ctx = c.getContext("2d");
ctx.moveTo(20,20);
ctx.lineTo(50,50);
ctx.stroke();

如果需要,您可以使用变量更改绘图的值。

在浏览器中进行测试以使其正常工作,您需要确保切换到包含画布的iframe(如果有)。

请参阅下面的步骤,使用相同的脚本,但稍微更改为写文字:


   /**
     * @Then /^signature test$/
     */
    public function signatureTest(){
        $script = 'var c = document.querySelector("canvas"); var ctx = c.getContext("2d"); ctx.fillStyle = "black"; ctx.font = "20px Georgia"; ctx.fillText("automation user",10,90);';
        $this->getSession()->executeScript($script);
    }

确保使用的选择器将选择画布元素类型。

第二个版本,尝试mousedown事件触发器。

    /**
     * @Then /^signature test$/
     */
    public function signatureTest(){
        $function = <<<JS
        (function(){
        var c = document.querySelector("canvas");

        event = document.createEvent('MouseEvent');
        event.initEvent('mousedown', true, true);

        var ctx = c.getContext("2d");
        ctx.fillStyle = "black";
        ctx.font = "20px Georgia";
        ctx.fillText("automation user",10,90);

        c.dispatchEvent(event);
        })()
JS;
        $this->getSession()->executeScript($function);
    }