我们如何使用Javascript正确点击链接或按钮?

时间:2014-11-13 16:25:41

标签: javascript selenium-webdriver codeception

我正在使用此模板的PHP + Ajax版本:http://192.241.236.31/themes/preview/smartadmin/1.5/ajaxversion/,Codeception WebDriver(Selenium)来执行我的测试。他们中的大多数工作正常,但我有一些随机的,是的,随机的!测试失败,所以我总是回到他们身边并试图变硬,希望将来某个时候它不会随机失败。其中一个失败的原因通常是由于界面上的错误点击。我告诉Codeception单击#lement-id,当它失败时,我看到它实际上在输出png中显示了一个不同的页面,但是激活的链接显示它试图单击正确的链接。有时我只需要在点击该特定链接之前加载一个不同的页面并等待10秒钟才能呈现它,它有效,傻吧?是的,但有时这也不起作用。

这就是我以前测试的方式:

$I->click('#element-id');

我必须使用元素id,因为它是一个多语言应用程序,所有(大多数)字符串来自一个字符串文件,它们可能会在某些时候发生变化并中断测试。

在太多的随机测试失败之后,我决定让前端自己负责在测试期间点击一些东西,这是一个漫长而愚蠢的循环射击,但它应该是有效的,所以我创建了一个functionalHelper:

public function clickElement($element)
{
    $I = $this->getDriver();

    $I->executeJS("clickElement('{$element}');");
}

两个Javascript函数:

function clickElement(element)
{
    element = jQuery(element);

    if(typeof element !== undefined)
    {
        fakeClick(element[0]);
    }

    return true;
}

function fakeClick(object)
{
    if (object.click)
    {
        object.click();
    }
    else if(document.createEvent)
    {
        var evt = document.createEvent("MouseEvents");
        evt.initMouseEvent("click", true, true, window,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        var allowDefault = object.dispatchEvent(evt);
    }
}

我在第一个中使用jQuery,因为它已经在模板中可用,并且更容易选择非ided的东西。

这很好用,你可以自己测试一下

1)打开页面:

http://192.241.236.31/themes/preview/smartadmin/1.5/ajaxversion/

2)执行

,在浏览器控制台中加载脚本
loadScript('https://www.dropbox.com/s/kuh22fjjsa8zq0i/app.js?dl=1');

3)点击内容:

日历

clickElement($x('//*[@id="left-panel"]/nav/ul/li[7]/a/span'));

窗口小部件

clickElement($x('//*[@id="left-panel"]/nav/ul/li[8]/a/span'));

因为模板使用哈希字符来控制页面的ajax部分而不是重新加载所有内容,所以我必须(以编程方式)将referer-url添加到我的所有href链接中,所以我可以在我的应用程序中重定向回到引用者,因为访问的url的哈希部分没有发送到服务器。这是一个链接示例:

<a href="/users?referer-href-url=/dashboard" title="Users" id="users-navigation">
    <span class="menu-item-parent">Users</span>
</a>

这基本上意味着用户在点击用户链接时正在查看仪表板。如果发生错误,应用程序会将用户重定向回仪表板,并显示错误消息。

问题在于,在测试期间,当使用以下方式测试时,当前网址是

$I->seeCurrentUrlEquals('/#/clients?referer-href-url=/clients');

变为

/#/clients

而不是

/#/clients?referer-href-url=/clients

发生有时,因为其他一些也有效。如果我手动浏览网站,它会在100%的时间内工作,我总是在地址栏中看到正确的URL。如果我手动执行clickElement()它也可以正常工作。问题只是我的套房正在运行。

以下是传递(绿色)的示例:

enter image description here

完全相同的测试随机失败(红色):

enter image description here

这是与失败测试相关的代码:

$I->clickElement('#clients-navigation');

$I->waitForText('Jane Doe', 10);

$I->seeCurrentUrlEquals('/#/clients?referer-href-url=/clients');

我通常会在点击后等待某些内容,因此页面可以有时间呈现。

您还可以看到有很多“我点击元素”,使用这些PHP和Javascript函数没有问题。

我正在使用:

Ubuntu 14.04
PHP 5.5.9
Codeception 2.0.7
Selenium 2.44.0 
Firefox 33.0

那么,这可能是什么问题? 这是在Javascript中单击元素的正确方法吗?

在这个过程中,我也经历了单独运行时没有失败但在批处理时失败的测试,但这可能是一个不同的问题,对吧?

0 个答案:

没有答案