Well, if I've gone to all of the trouble of getting Selenium installed...
Despite not being able to get The Intern to properly test Polymer elements, the effort was not a complete loss. There are some nice features in Intern that I wish existed elsewhere in JavaScript testing space. My favorite is probably the built-in web server. I know it's stupid, but I hate having to run my own web server in tests—there are just so many other moving parts that adding another is a source of some consternation. I also picked up a useful little trick from the Intern's configuration. They suggest an NPM post-install script to Bower install client side packages:
{ "name": "plain_old_forms", // ... "scripts": { "postinstall": "bower install", "test": "intern-runner config=tests/intern" } }That seems perfectly reasonable, to the point of a best practice kind of thing, so I will likely adopt it going forward.
That said, my experience with the Intern was ultimately a failure since it was not able to reference Polymer elements, which puts a damper on testing them. But since I went to all the trouble of getting all things Selenium and Web Driver installed yesterday, I think that I will give Protractor a shot with testing Polymer elements. Sure, Protractor is really meant for testing AngularJS code and it requires a separate web server to test code, but it installs a bunch of the WebDriver stuff for me and, who knows, maybe it'll actually be able to reference Polymer elements.
I have fiddled with Protractor before, but it has been a while:
$ protractor --version Version 0.22.0So I upgrade:
$ npm install -g protractor /home/chris/local/node-v0.10.20/bin/protractor -> /home/chris/local/node-v0.10.20/lib/node_modules/protractor/bin/protractor /home/chris/local/node-v0.10.20/bin/webdriver-manager -> /home/chris/local/node-v0.10.20/lib/node_modules/protractor/bin/webdriver-manager protractor@1.5.0 /home/chris/local/node-v0.10.20/lib/node_modules/protractor ... ➜ protractor git:(master) ✗ protractor --version Version 1.5.0I already have the latest Selenium installed, but Protractor prefers Chrome as the default browser testing environment, which I do not have. So I let Protractor install it:
$ webdriver-manager update Updating selenium standalone ... Updating chromedriver ...I have to admit that, even though it is a thin wrapper around the normal Java Selenium server startup command, I find Protractor's thin wrapper much more appealing:
webdriver-manager start seleniumProcess.pid: 26247 23:40:45.524 INFO - Launching a standalone server Setting system property webdriver.chrome.driver to /home/chris/local/node-v0.10.20/lib/node_modules/protractor/selenium/chromedriver 23:40:45.570 INFO - Java: Oracle Corporation 24.65-b04 23:40:45.571 INFO - OS: Linux 3.13.0-37-generic amd64 23:40:45.585 INFO - v2.44.0, with Core v2.44.0. Built from revision 76d78cf explorer, version=}] does not match with current platform: LINUX 23:40:45.734 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub ... 23:40:45.766 INFO - Started HttpContext[/wd,/wd] 23:40:45.770 INFO - Started SocketListener on 0.0.0.0:4444 23:40:45.770 INFO - Started org.openqa.jetty.jetty.Server
I already have a smoke test page for the
<x-pizza>
pizza building element that I would like to test, so I fire up a Python simple server against which my tests can run:$ python -m SimpleHTTPServer 8000 Serving HTTP on 0.0.0.0 port 8000 ...
This is a fresh copy of my
<x-pizza>
element. It has a bower.json for all of the necessary dependencies as well as an npm package.json
for helper packages like Grunt. I add the post-install "trick" from the Intern to my package.json
:{ "name": "plain_old_forms", "devDependencies": { "grunt": "~0.4.0", "grunt-contrib-watch": "~0.5.0" }, "scripts": { "postinstall": "bower install" } }After an
npm install
, I am ready to test:describe('<x-pizza>', function(){ var el; describe('element content', function(){ beforeEach(function(){ browser.get('http://localhost:8000'); }); it('has a shadow DOM', function(){ el = $('x-pizza'); expect(el.shadowRoot).not.toBe(null); }); }); });This is not a "real" test. It just verifies that the
<x-pizza>
element is a real Polymer element—that it has a shadow root. This is the test that I was never able to get running on the Intern.Unfortunately, this does not work any better in Protractor than in Intern. When I run the test, I get:
protractor conf.js Using the selenium server at http://localhost:4444/wd/hub [launcher] Running 1 instances of WebDriver F Failures: 1) <x-pizza> element content has a shadow DOM Message: Error: Angular could not be found on the page http://localhost:8000/ : retries looking for angular exceeded Stacktrace: Error: Angular could not be found on the page http://localhost:8000/ : retries looking for angular exceeded ==== async task ==== Protractor.get(http://localhost:8000/) - test for angular at [object Object].<anonymous> (/home/chris/repos/polymer-book/play/protractor/tests/XPizzaSpec.js:6:15) ==== async task ==== Asynchronous test function: beforeEach() Error at [object Object].<anonymous> (/home/chris/repos/polymer-book/play/protractor/tests/XPizzaSpec.js:5:5) at [object Object].<anonymous> (/home/chris/repos/polymer-book/play/protractor/tests/XPizzaSpec.js:4:3) at Object.<anonymous> (/home/chris/repos/polymer-book/play/protractor/tests/XPizzaSpec.js:1:63) Finished in 10.667 seconds 1 test, 2 assertions, 1 failureSo it seems that Protractor is more than a little coupled to Angular. Bummer.
I am somewhat surprised that Protractor is coupled to Angular to the point that it does not work with anything else. I had just assumed that it worked better with Angular than with other things. That is good to know, I suppose, but not terribly helpful for my current efforts. I may give the basic selenium-webdriver NPM package a try tomorrow, but that may be veering too close to my dislike of raw Selenium.
Day #24
http://ng-learn.org/2014/02/Protractor_Testing_With_Angular_And_Non_Angular_Sites/
ReplyDelete