是否可以在量角器中单击带有phantomJS的元素?

时间:2015-09-02 17:36:52

标签: javascript selenium-webdriver phantomjs protractor

我在使用PhantomJS作为浏览器的选择时尝试单击按钮,我收到很多错误。

首次尝试,直接点击按钮:

var button  = $('#protractorTest');
button.click();

返回错误:

Element is not currently visible and may not be manipulated

尝试调整phantomJS视口的大小似乎没有任何效果。该按钮位于屏幕的左上角,但不知何故出于(如果我没记错的话)默认的400x300视口。

browser.manage().window().setSize(1920, 1080);

我似乎无法在任何时间记录窗口大小,我能得到的最接近的是未记录的未完成承诺。所以,我不确定屏幕尺寸是否会发生变化。

通过搜索许多其他问题,我尝试了各种执行脚本,不同的方法来选择元素到目前为止没有成功。

尝试运行一个执行脚本来点击它,我遇到的问题是undefined不是一个函数:

var hiddenElement = browser.findElement(by.id('protractorTest'));
browser.executeScript("arguments[0].click()", hiddenElement).then(function() {
    expect(true).toMatch(true);
});

返回此错误:

Failed: {"errorMessage":"'undefined' is not a function (evaluating 'arguments[0].click()')","request":{"headers":{"Accept-Encoding":"gzip,deflate","Connection":"Keep-Alive","Content-Length":"75","Content-Type":"application/json; charset=utf-8","Host":"localhost:42837","User-Agent":"Apache-HttpClient/4.3.6 (java 1.5)"},"httpVersion":"1.1","method":"POST","post":"{\"script\":\"arguments[0].click()\",\"args\":[{\"ELEMENT\":\":wdc:1441214073816\"}]}","url":"/execute","urlParsed":{"anchor":"","query":"","file":"execute","directory":"/","path":"/execute","relative":"/execute","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/execute","queryKey":{},"chunks":["execute"]},"urlOriginal":"/session/0fa194a0-5196-11e5-a5f1-99fee78af55e/execute"}}
    Build info: version: '2.45.0', revision: '5017cb8', time: '2015-02-26 23:59:50'
    System info: host: 'DS5539', ip: '10.4.4.65', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_40'
    Driver info: driver.version: unknown

尝试使用webElement选择器运行测试会返回与上面相同的错误:

var hiddenElement = element(by.id('protractorTest')).getWebElement();
browser.executeScript("arguments[0].click()", hiddenElement).then(function() {
    expect(successPage.isDisplayed).toBeTruthy();
});

尝试使用量角器选择运行测试会产生不同的错误:

var hiddenElement = $('#protractorTest');
browser.executeScript("arguments[0].click()", hiddenElement).then(function() {
    expect(successPage.isDisplayed).toBeTruthy();
});

Maximum call stack size exceeded

有没有办法使用phantomJS和量角器点击一个按钮?

1 个答案:

答案 0 :(得分:4)

首先,如果您选择PhantomJS作为目标浏览器,我打赌您会在最近的将来回到SO并遇到新问题。甚至是protractor个开发人员recommend against it

  

我们建议不要使用PhantomJS进行Protractor测试。那里   有很多报道的PhantomJS崩溃和行为问题   与真正的浏览器不同。

另外,如果您正在进行测试,那么您应该让测试环境尽可能接近最终用户的环境 - 您是否使用PhantomJS看过应用程序的用户? - 可能不是。

如果你因为没有真正的显示器而无法接收PhantomJS,那么你也可以在无头模式下运行firefox或chrome,请参阅:

另外,请阅读这篇@Louis's answer - 关于无头与头脑的精彩文章。

或者,您可以在BrowserStack or Sauce Labs or similar services使用远程selenium服务器。

您采取的最新方法存在问题 - 应该调用isDisplayed

var hiddenElement = $('#protractorTest');
browser.executeScript("arguments[0].click()", hiddenElement).then(function() {
    expect(successPage.isDisplayed()).toBeTruthy();
    //                        HERE^
});

或者/或者,您可以使用scrollIntoView()滚动查看元素:

var button  = $('#protractorTest');
browser.executeScript("arguments[0].scrollIntoView();", button.getWebElement()).then(function () {
    button.click();
});

添加explicit wait也可能有所帮助:

var EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(button), 5000);