我正在使用此模板的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()
它也可以正常工作。问题只是我的套房正在运行。
以下是传递(绿色)的示例:
完全相同的测试随机失败(红色):
这是与失败测试相关的代码:
$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中单击元素的正确方法吗?
在这个过程中,我也经历了单独运行时没有失败但在批处理时失败的测试,但这可能是一个不同的问题,对吧?