Writing Test Cases for NW.js


Test Framework

NW.js is using a tiny Python based framework only in three files. You can read the source code in test directory.

Each test case in NW.js is a runnable app, so that you can manually run the case without the framework.

In NW.js, there are two types of test cases: auto and remoting. See Write Test Cases sections below to see the instructions.

To run the test cases, use the following command:

python test/test.py -t 80 auto
python test/test.py -t 80 remoting

Write Test Cases

Auto Test Case

TODO

Remoting Test Case

The remoting test cases are driven by ChromeDriver. Usually these test cases involves user interaction. See Test with ChromeDriver for the usage of ChromeDriver.

A remoting test case requires a test.py file in the root of the application folder.

Here is the template of test.py file:

import time
import os

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("nwapp=" + os.path.dirname(os.path.abspath(__file__)))

driver = webdriver.Chrome(executable_path=os.environ['CHROMEDRIVER'], chrome_options=chrome_options)
time.sleep(1)
try:
    print driver.current_url
    # Put your test code here using `assert`
finally:
    driver.quit()

The real case is an NW.js app. With ChromeDriver, you can simulate mouse clicks and inputs and then get the content of some DOM element. For example, with following code, when you click the button of “Click Me”, a new DOM element will be added to the document with content of “success”:

<button id="clickme" onclick="success()">Click Me</button>
<script>
function success() {
    var el = document.createElement('div');
    el.id = 'result';
    el.innerHTML = 'success';
    document.body.appendChild(el);
}
</script>

Then you can test it in test.py script:

driver.implicitly_wait(10) # 10s timeout when finding an element

clickme = driver.find_element_by_id('clickme')
clickme.click() # click the button

result = driver.find_element_by_id('result')
assert("success" in result.get_attribute('innerHTML')) # assert "success" is in the element

Run Nightly Test Cases

Here are some preparations before testing.

1.Download NW SDK version.

2.Downloading selenium python library for NW with git.
The repo address and the git commit id is in manage dependencies(replace nw35 with the proper branch name if you are not testing 0.35).
Look for ‘third_party/webdriver/pylib’ in deps part of that file. The form you will see is as follows:

 'src/third_party/webdriver/pylib':
    Var('chromium_git') + '/external/selenium/py.git' + '@' + 'expected commit id',

Then look for the value of Var(e.g.chromium_git) in vars part of that file. After you clone the pylib repo, make sure the git tip commit id is the same as expected.

3.Set environment variables.
Set CHROMEDRIVER to the path of chromedriver.exe in NW SDK; set PYTHONPATH to the ‘py’ folder you cloned.

4.Install Python 2.7 if needed.

5.Clone nw source repo: nwjs.

Then you can change directory to nw repo/test;
run python test.py -d <path to NW SDK> -t 60 sanity