def _deluge_ensure_logged_in(browser): """Ensure that password dialog is answered and we can interact.""" url = config['DEFAULT']['url'] + '/deluge' def service_is_available(): if browser.is_element_present_by_xpath( '//h1[text()="Service Unavailable"]'): access_url(browser, 'deluge') return False return True if browser.url != url: browser.visit(url) # After a backup restore, service may not be available immediately eventually(service_is_available) time.sleep(1) # Wait for Ext.js application in initialize if _deluge_get_active_window_title(browser) != 'Login': return browser.find_by_id('_password').first.fill('deluge') _deluge_click_active_window_button(browser, 'Login') assert eventually( lambda: _deluge_get_active_window_title(browser) != 'Login') eventually(browser.is_element_not_present_by_css, args=['#add.x-item-disabled'], timeout=0.3)
def _deluge_open_connection_manager(browser): """Open the connection manager dialog if not already open.""" title = 'Connection Manager' if _deluge_get_active_window_title(browser) == title: return browser.find_by_css('button.x-deluge-connection-manager').first.click() eventually(lambda: _deluge_get_active_window_title(browser) == title)
def transmission_upload_sample_torrent(browser): """Upload a sample torrent into transmission.""" browser.visit(config['DEFAULT']['url'] + '/transmission') file_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'sample.torrent') browser.click_link_by_id('toolbar-open') eventually(browser.is_element_not_present_by_css, args=['#upload-container[style="display: none;"]']) browser.attach_file('torrent_files[]', [file_path]) browser.click_link_by_id('upload_confirm_button') eventually(browser.is_element_present_by_css, args=['#torrent_list .torrent'])
def syncthing_add_folder(browser, folder_name, folder_path): """Add a new folder to Synthing.""" _syncthing_load_main_interface(browser) add_folder_xpath = '//button[contains(@ng-click, "addFolder")]' browser.find_by_xpath(add_folder_xpath).click() folder_dialog = browser.find_by_id('editFolder').first eventually(lambda: folder_dialog.visible) browser.find_by_id('folderLabel').fill(folder_name) browser.find_by_id('folderPath').fill(folder_path) save_folder_xpath = './/button[contains(@ng-click, "saveFolder")]' folder_dialog.find_by_xpath(save_folder_xpath).first.click() eventually(lambda: not folder_dialog.visible)
def syncthing_remove_folder(browser, folder_name): """Remove a folder from Synthing.""" _syncthing_load_main_interface(browser) # Find folder folder = None for current_folder in browser.find_by_css('#folders > .panel'): name = current_folder.find_by_css('.panel-title-text span').first.text if name == folder_name: folder = current_folder break # Edit folder button folder.find_by_css('button.panel-heading').first.click() eventually(lambda: folder.find_by_css('div.collapse.in')) edit_folder_xpath = './/button[contains(@ng-click, "editFolder")]' edit_folder_button = folder.find_by_xpath(edit_folder_xpath).first edit_folder_button.click() # Edit folder dialog folder_dialog = browser.find_by_id('editFolder').first eventually(lambda: folder_dialog.visible) remove_button_xpath = './/button[contains(@data-target, "remove-folder")]' folder_dialog.find_by_xpath(remove_button_xpath).first.click() # Remove confirmation dialog remove_folder_dialog = browser.find_by_id('remove-folder-confirmation') eventually(lambda: remove_folder_dialog.visible) remove_button_xpath = './/button[contains(@ng-click, "deleteFolder")]' remove_folder_dialog.find_by_xpath(remove_button_xpath).first.click() eventually(lambda: not folder_dialog.visible)
def verify_coquelicot_upload_password(browser, password): browser.visit(config['DEFAULT']['url'] + '/coquelicot') browser.find_by_id('upload_password').fill(password) actions = ActionChains(browser.driver) actions.send_keys(Keys.RETURN) actions.perform() assert eventually(browser.is_element_present_by_css, args=['div[style*="display: none;"]'])
def upload_file_to_coquelicot(browser, file_path, password): """Upload a local file from disk to coquelicot.""" verify_coquelicot_upload_password(browser, password) browser.attach_file('file', file_path) interface.submit(browser) assert eventually(browser.is_element_present_by_css, args=['#content .url']) url_textarea = browser.find_by_css('#content .url textarea').first return url_textarea.value
def deluge_remove_all_torrents(browser): """Remove all torrents from deluge.""" _deluge_ensure_connected(browser) while browser.find_by_css('#torrentGrid .torrent-name'): browser.find_by_css('#torrentGrid .torrent-name').first.click() # Click remove toolbar button browser.find_by_id('remove').first.click() # Remove window shows up assert eventually(lambda: _deluge_get_active_window_title(browser) == 'Remove Torrent') _deluge_click_active_window_button(browser, 'Remove With Data') # Remove window disappears assert eventually(lambda: not _deluge_get_active_window_title(browser))
def _deluge_ensure_connected(browser): """Type the connection password if required and start Deluge daemon.""" _deluge_ensure_logged_in(browser) # Change Default Password window appears once. if _deluge_get_active_window_title(browser) == 'Change Default Password': _deluge_click_active_window_button(browser, 'No') assert eventually(browser.is_element_not_present_by_css, args=['#add.x-item-disabled'])
def verify_coquelicot_upload_password(browser, password): browser.visit(config['DEFAULT']['url'] + '/coquelicot') # ensure the password form is scrolled into view browser.execute_script('window.scrollTo(100, 0)') browser.find_by_id('upload_password').fill(password) actions = ActionChains(browser.driver) actions.send_keys(Keys.RETURN) actions.perform() assert eventually(browser.is_element_present_by_css, args=['div[style*="display: none;"]'])
def ttrss_unsubscribe(browser): """Unsubscribe from a feed in TT-RSS.""" _ttrss_load_main_interface(browser) expand = browser.find_by_css('span.dijitTreeExpandoClosed') if expand: expand.first.click() browser.find_by_text('Planet Debian').click() browser.execute_script("quickMenuGo('qmcRemoveFeed')") prompt = browser.get_alert() prompt.accept() assert eventually(_ttrss_is_feed_shown, [browser, True])
def ttrss_subscribe(browser): """Subscribe to a feed in TT-RSS.""" _ttrss_load_main_interface(browser) browser.find_by_text('Actions...').click() browser.find_by_text('Subscribe to feed...').click() browser.find_by_id('feedDlg_feedUrl').fill( 'https://planet.debian.org/atom.xml') browser.find_by_text('Subscribe').click() if browser.is_text_present('You are already subscribed to this feed.'): browser.find_by_text('Cancel').click() expand = browser.find_by_css('span.dijitTreeExpandoClosed') if expand: expand.first.click() assert eventually(_ttrss_is_feed_shown, [browser])
def deluge_upload_sample_torrent(browser): """Upload a sample torrent into deluge.""" _deluge_ensure_connected(browser) number_of_torrents = _deluge_get_number_of_torrents(browser) # Click add toolbar button browser.find_by_id('add').first.click() # Add window appears eventually( lambda: _deluge_get_active_window_title(browser) == 'Add Torrents') file_path = os.path.join(os.path.dirname(__file__), '..', 'data', 'sample.torrent') if browser.find_by_id('fileUploadForm'): # deluge-web 2.x browser.attach_file('file', file_path) else: # deluge-web 1.x browser.find_by_css('button.x-deluge-add-file').first.click() # Add from file window appears eventually(lambda: _deluge_get_active_window_title(browser) == 'Add from File') # Attach file browser.attach_file('file', file_path) # Click Add _deluge_click_active_window_button(browser, 'Add') eventually( lambda: _deluge_get_active_window_title(browser) == 'Add Torrents') # Click Add time.sleep(1) _deluge_click_active_window_button(browser, 'Add') eventually( lambda: _deluge_get_number_of_torrents(browser) > number_of_torrents)
def _syncthing_load_main_interface(browser): """Close the dialog boxes that many popup after visiting the URL.""" access_url(browser, 'syncthing') def service_is_available(): if browser.is_element_present_by_xpath( '//h1[text()="Service Unavailable"]'): access_url(browser, 'syncthing') return False return True # After a backup restore, service may not be available immediately eventually(service_is_available) # Wait for javascript loading process to complete browser.execute_script(''' document.is_ui_online = false; var old_console_log = console.log; console.log = function(message) { old_console_log.apply(null, arguments); if (message == 'UIOnline') { document.is_ui_online = true; console.log = old_console_log; } }; ''') eventually(lambda: browser.evaluate_script('document.is_ui_online'), timeout=5) # Dismiss the Usage Reporting consent dialog usage_reporting = browser.find_by_id('ur').first eventually(lambda: usage_reporting.visible, timeout=2) if usage_reporting.visible: yes_xpath = './/button[contains(@ng-click, "declineUR")]' usage_reporting.find_by_xpath(yes_xpath).first.click() eventually(lambda: not usage_reporting.visible)
def transmission_remove_all_torrents(browser): """Remove all torrents from transmission.""" browser.visit(config['DEFAULT']['url'] + '/transmission') while True: torrents = browser.find_by_css('#torrent_list .torrent') if not torrents: break torrents.first.click() eventually(browser.is_element_not_present_by_css, args=['#toolbar-remove.disabled']) browser.click_link_by_id('toolbar-remove') eventually(browser.is_element_not_present_by_css, args=['#dialog-container[style="display: none;"]']) browser.click_link_by_id('dialog_confirm_button') eventually(browser.is_element_present_by_css, args=['#toolbar-remove.disabled'])
def _ttrss_load_main_interface(browser): """Load the TT-RSS interface.""" access_url(browser, 'tt-rss') overlay = browser.find_by_id('overlay') eventually(lambda: not overlay.visible)
def ejabberd_has_contact(browser): """Check whether the contact is in Ejabberd user's roster.""" return eventually(site.jsxc_has_contact, [browser])
def verify_inaccessible_share(browser, name): """Verify that given URL for a given share name denies permission.""" url = '{}/share/{}'.format(default_url, name) browser.visit(url) eventually(lambda: '/plinth' in browser.url, args=[])
def service_should_be_running(session_browser, service_name): assert eventually(service.is_running, args=[session_browser, service_name])
def verify_mediawiki_no_create_account_link(browser): browser.visit(config['DEFAULT']['url'] + '/mediawiki/index.php/Special:CreateAccount') assert eventually(browser.is_element_not_present_by_id, args=['wpCreateaccount'])
def login_to_mediawiki_with_credentials(browser, username, password): _login_to_mediawiki(browser, username, password) # Had to put it in the same step because sessions don't # persist between steps assert eventually(browser.is_element_present_by_id, args=['t-upload'])
def mediawiki_has_main_page(browser): """Check if mediawiki main page exists.""" return eventually(_mediawiki_has_main_page, [browser])
def verify_mediawiki_no_anonymous_reads_edits_link(browser): browser.visit(config['DEFAULT']['url'] + '/mediawiki') assert eventually(browser.is_element_not_present_by_id, args=['ca-nstab-main']) assert eventually(browser.is_element_present_by_id, args=['ca-nstab-special'])
def service_should_not_be_running(browser, service_name): assert eventually(service.is_not_running, args=[browser, service_name])