2017-06-21 55 views
0

我一直在尝试在Docker中运行一些量角器测试,但是我发现了一个我无法解决的问题。 量角器说元素不在Docker的网页里面,但它在localhost中。此外,网页的CURL公开了HTML元素(如您所知,而不是Angular组件内的HTML),但仍未找到该元素。在Docker中运行的量角器返回元素不存在但在localhost中

首先,测试是在本地主机正常工作:

/*********** TESTING **********/ 
beforeAll(function(){ 
    browser.sleep(1).then(function() { 
     console.log('Browser running ...'); 
    }); 

    browser.driver.manage().window().getSize().then(function(size) { 
     console.log('Starting browser size', size); 
    }); 

    browser.get(specifiedURL+"/app/users/#/register"); 

    browser.waitForAngular(); //We expect to wait for angular to be loaded so browser can load correctly his components   

    browser.getCurrentUrl().then(function(url){ 
     console.info("Browser redirected to "+url); 
    }); 

    browser.refresh(); //Refresh the view so it loads the content properly at the specified ngStorage-project url 
}); 

和两个测试

it("should redirect to the specified page", function(){ 
    expect(browser.getCurrentUrl()).toEqual(specifiedURL+"/app/users/#/register"); 
}); 

it("should exists a surname input in the page",function(){ 
    var displaySurnameInput = element(by.id('signup-surname')); 

    browser.wait(function() { 
     return displaySurnameInput.isPresent(); 
    }, 5000); 

    expect(displaySurnameInput.getText()).toEqual(''); 
}); 

let SpecReporter = require('jasmine-spec-reporter').SpecReporter; 

exports.config = { 
    framework: "jasmine2", 
    suites: { 
    login: "tests/e2e/login/**/*Spec.js" 
    }, 
    multiCapabilities: [{ 
    browserName: "chrome", 
    chromeOptions: { 
     args: [ "--headless", "--window-size=1200x800", "--disable-gpu", "--test-type", "--no-sandbox"] 
    } 
    }], 
    jasmineNodeOpts: { 
    showColors: true, 
    silent: true, 
    defaultTimeoutInterval: 360000, 
    print: function() { } 
    }, 
    onPrepare: function() { 
    jasmine.getEnv().addReporter(new SpecReporter({ 
     spec: { 
     displayStacktrace: false 
     } 
    })); 
    } 
} 

配置文件中的泊坞窗链接到一个码头工人-nginx服务器暴露于端口80,所以我们可以检查一个项目是否正确运行或不运行(它是)。 当我运行的泊坞窗命令:

docker run -it -v /dev/shm:/dev/shm --privileged -e SCREEN_WIDTH=1920 -e SCREEN_HEIGHT=1480 -e SCREEN_DEPTH=24 --link ify-nginx:ify-nginx ify/test-runner bash 

我可以使用curl访问网页,它显示了网页的HTML浏览器(实际上是相同的结果本地主机回报卷曲),但不知何故量角器不在URL内部找到元素(我已经试图通过多个茉莉花函数获取元素,并且仍然发生同样的问题)。

LOCALHOST PROTRACTOR_RESULT

泊坞窗 PROTRACTOR_RESULT

谢谢!

EDIT1:

使用这里面的码头工人产生错误,而不是在本地主机

it("should exists a surname input in the page",function(){ 
    var displaySurnameInput = element(by.id('signup-surname')); 

    browser.pause(); 

    browser.wait(function() { 
     return displaySurnameInput.isPresent(); 
    }, 5000); 

    expect(displaySurnameInput.getText()).toEqual(''); 
}); 

错误(我敢新手我不能粘贴超过2幅图像,所以我贴这里代码)

[08:33:33] I/protractor - 
module.js:487 
    throw err; 
    ^
Error: Cannot find module '_debugger' 

EDIT2:

使用

browser.executeScript("return arguments[0].innerHTML;", $('html')).then(function (content) { console.log(content); }); 

我打印的HTML揭示的组件......但不是内部HTML(它奠定了正确的ID和实际输入元素)

<section ng-show="step==1" style="overflow:hidden;"> 
      <ify-input id="signup" field="name" ng-model="user.name" class="ng-pristine ng-untouched ng-valid ng-scope"><!-- ngIf: isAllowed(field) --></ify-input> 
      <a id="signup-step1" class="ify-button ng-binding" ng-click="step2()">{{ ("Next" | translate).toUpperCase() }}</a> 
    </section> 

我可以运行一个测试,通过搜索通过.model的元素,但它不是指内部输入,因为它应该做by.id.

it("should find a model.name in the dom", function(){ 
     var displayNameInput = element(by.model("user.name")); 

     browser.wait(function() { 
      return displayNameInput.isPresent(); 
     }, 5000); 

     expect(displayNameInput.getText()).toEqual(''); 
}); 

问题仍然清晰,无法获得角分量

的内部HTML

EDIT3:

我测试过此页https://docs.angularjs.org/examples/example-heroComponentSimple/index.html,暴露了HTML,它似乎是阅读确定组件的内部html。

HTML暴露:

<body ng-app="heroApp" class="ng-scope"> 
    <!-- components match only elements --> 
<div ng-controller="MainCtrl as ctrl" class="ng-scope"> 
    <b>Hero</b><br> 
    <hero-detail hero="ctrl.hero" class="ng-isolate-scope"><span class="ng-binding">Name: Spawn</span></hero-detail> 
</div> 

测试:

 it("example component web random",function(){ 
     browser.get("https://docs.angularjs.org/examples/example-heroComponentSimple/index.html"); 

     browser.waitForAngular(); 

browser.executeScript("return arguments[0].innerHTML;", $('html')).then(function (content) { console.log(content); }); 

     expect(element(by.css('.ng-binding')).isPresent()).toBe(true); 
    }); 

回答

0

Docker试图连接不存在的API http://ify-nginx/api/ ... 该调用期望在寄存器表单上生成所需字段的列表。当返回null时,字段不会被生成,本身,量角器找不到任何东西。

正如你可以在上面看到,奇怪的事情是发生在这里(ngIf:isAllowed)

<ify-input id="signup" field="name" ng-model="user.name" class="ng-pristine ng-untouched ng-valid ng-scope"><!-- ngIf: isAllowed(field) --></ify-input> 

我们得到了一个,如果在API代码检查,如果网址为“本地主机”或服务器的IP,而不是' IFY-nginx的”。当检测到ify-nginx时,api域被重定向到它,并且它不加载内容。

0

您漏填了 “;”在browser.wait返回结束时。 此外,尝试

return displaySurnameInput.isPresent(); 

而且是5秒足以载入页面?

您也可以通过禁用报告库来禁用获取有关错误的更多详细信息。或者它可以选择显示更多细节。

如果使用browser.ignoreSynchronisation = true;在浏览器之前等待并等待之后,它会改变什么?

+0

你好bwarff!它仍然在发生......但我发现了一个奇怪的行为,browser.pause()在docker中不起作用,所以......我不知道这个问题是关于chrome-> docker而不是量角器 - > docker – Alf

+0

你没有手如果在Docker中完成,则恢复暂停。 但是,您可以显示页面上的元素并将其记录下来。例如,您可以像$('html')那样定义一个定位器,并在此时显示您在页面上的内容,如下所示: $('html')。getAttribute('textContent')。then(function(内容){ console.log(content); }); 你可以使用其他getAttribute textContent显示dom,但我不记得使用哪种方法。 另外,如果您不刷新页面,您的测试是否正常? – bwarff

+0

刷新页面是为了从LocalStorage正确加载正确的api-url(我删除了代码,因为它不认为这很重要)。我试图公开dom到控制台,但我不能:') – Alf