diff --git a/.travis.yml b/.travis.yml index de8531b5d9..464256b1dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,15 @@ python: services: - mysql +before_install: + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" + install: - sudo apt-get purge -y mysql-common - wget https://raw.githubusercontent.com/frappe/bench/master/install_scripts/setup_frappe.sh - sudo bash setup_frappe.sh --skip-setup-bench --mysql-root-password travis + - sudo pip install --upgrade pip - sudo service redis-server start - rm $TRAVIS_BUILD_DIR/.git/shallow - cd ~/ && bench init frappe-bench --frappe-path $TRAVIS_BUILD_DIR @@ -23,7 +28,7 @@ script: - bench build-website - bench serve & - sleep 10 - - bench --verbose run-tests + - bench --verbose run-tests --driver Firefox before_script: - mysql -e 'create database test_frappe' diff --git a/frappe/public/js/frappe/views/module/moduleview.js b/frappe/public/js/frappe/views/module/moduleview.js index 517f877eb8..deeb1f9fbb 100644 --- a/frappe/public/js/frappe/views/module/moduleview.js +++ b/frappe/public/js/frappe/views/module/moduleview.js @@ -85,20 +85,23 @@ frappe.views.moduleview.ModuleView = Class.extend({ .appendTo(this.page.main); $(this.sections[name]).find(".module-item").each(function(i, mi) { - $(mi).on("click", function(event) { - // if clicked on open notification! - if (event.target.classList.contains("open-notification")) { - var doctype = event.target.getAttribute("data-doctype"); - frappe.route_options = frappe.boot.notification_info.conditions[doctype]; - } - var item = data.items[$(mi).attr("data-item-index")]; - if(item.type==="help") { - frappe.help.show_video(item.youtube_id); - return false; - } else { - frappe.set_route(me.get_route(item)); - } - }); + var item = data.items[$(mi).attr("data-item-index")]; + $(mi) + .attr("data-route", me.get_route(item).join("/")) + .attr("data-label", item.name) + .on("click", function(event) { + // if clicked on open notification! + if (event.target.classList.contains("open-notification")) { + var doctype = event.target.getAttribute("data-doctype"); + frappe.route_options = frappe.boot.notification_info.conditions[doctype]; + } + if(item.type==="help") { + frappe.help.show_video(item.youtube_id); + return false; + } else { + frappe.set_route(me.get_route(item)); + } + }); }); } diff --git a/frappe/tests/test_client_login.py b/frappe/tests/test_client_login.py index ac2eb82543..1cec26e17b 100644 --- a/frappe/tests/test_client_login.py +++ b/frappe/tests/test_client_login.py @@ -9,15 +9,12 @@ selenium_tests = True class TestLogin(unittest.TestCase): def setUp(self): - return sel.login() def test_login(self): - return self.assertEquals(sel._driver.current_url, sel.get_localhost() + "/desk") def test_to_do(self): - return # does not pass in travis ?? sel.go_to_module("ToDo") sel.primary_action() sel.wait_for_page("Form/ToDo") @@ -25,11 +22,3 @@ class TestLogin(unittest.TestCase): sel.primary_action() self.assertTrue(sel.wait_for_state("clean")) -# def test_material_request(self): -# sel.new_doc("Stock", "Material Request") -# sel.add_child("items") -# sel.set_field("item_code", "_Test Item") -# sel.set_field("schedule_date", "10-10-2014") -# sel.primary_action() -# sel.wait_for_state("clean") - diff --git a/frappe/utils/sel.py b/frappe/utils/sel.py index b5db94f5ec..c714c006d4 100644 --- a/frappe/utils/sel.py +++ b/frappe/utils/sel.py @@ -59,7 +59,7 @@ def login(wait_for_id="#page-desktop"): get(get_localhost() + "/login") wait("#login_email") set_input("#login_email", "Administrator") - set_input("#login_password", "admin" + Keys.RETURN) + set_input("#login_password", "admin", key=Keys.RETURN) wait(wait_for_id) logged_in = True @@ -86,7 +86,7 @@ def go_to_module(module_name, item=None): if item: elem = find('[data-label="{0}"]'.format(item))[0] elem.click() - page = unquote(elem.get_attribute("href").split("#", 1)[1]) + page = elem.get_attribute("data-route") wait_for_page(page) def new_doc(module, doctype): @@ -98,13 +98,19 @@ def add_child(fieldname): find('[data-fieldname="{0}"] .grid-add-row'.format(fieldname))[0].click() wait('[data-fieldname="{0}"] .form-grid'.format(fieldname)) +def done_add_child(fieldname): + selector = '[data-fieldname="{0}"] .grid-row-open .btn-success'.format(fieldname) + scroll_to(selector) + wait_till_clickable(selector).click() + def find(selector, everywhere=False): if cur_route and not everywhere: selector = cur_route + " " + selector return _driver.find_elements_by_css_selector(selector) def set_field(fieldname, value, fieldtype="input"): - set_input('{0}[data-fieldname="{1}"]'.format(fieldtype, fieldname), value + Keys.TAB) + selector = '{0}[data-fieldname="{1}"]'.format(fieldtype, fieldname) + set_input(selector, value, key=Keys.TAB) wait_for_ajax() def set_select(fieldname, value): @@ -113,7 +119,9 @@ def set_select(fieldname, value): wait_for_ajax() def primary_action(): - wait_till_visible(".page-actions .primary-action").click() + selector = ".page-actions .primary-action" + scroll_to(selector) + wait_till_clickable(selector).click() wait_for_ajax() def wait_for_page(name): @@ -152,13 +160,22 @@ def wait(selector, everywhere=False): def get_wait(): return WebDriverWait(_driver, 20) -def set_input(selector, text): +def set_input(selector, text, key=None): elem = find(selector)[0] elem.clear() elem.send_keys(text) + if key: + time.sleep(1) + elem.send_keys(key) if input_wait: time.sleep(input_wait) +def scroll_to(selector): + execute_script("frappe.ui.scroll('{0}')".format(selector)) + +def execute_script(js): + _driver.execute_script(js) + def close(): global _driver, pipe if _driver: diff --git a/test_sites/test_site/site_config.json b/test_sites/test_site/site_config.json index 9c78cfaaad..62bb059a65 100644 --- a/test_sites/test_site/site_config.json +++ b/test_sites/test_site/site_config.json @@ -6,5 +6,6 @@ "mail_login": "test@example.com", "mail_password": "test", "admin_password": "admin", - "run_selenium_tests": 1 + "run_selenium_tests": 1, + "host_name": "http://localhost:8000" }