Example #1
0
    def get_bill_details(self, bill_row: BillSummaryRow):
        """Click on the 'details' link for a given bill summary, and scrape the resulting page"""
        with IFrameSwitch(self.driver, "mainFrame"):
            # We open the page in a new window by shift-clicking.
            actions = ActionChains(self.driver)
            actions.move_to_element(bill_row.detail_link)
            actions.key_down(Keys.SHIFT)
            actions.click(bill_row.detail_link)
            actions.key_up(Keys.SHIFT)
            actions.perform()

        self.driver.wait().until(window_count_equals(2))
        other_window = self.driver.window_handles[1]
        detail_raw = {}
        with WindowSwitch(self.driver, other_window, close=True):
            WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.XPATH, "//table")))
            table = self.driver.find_element_by_tag_name("table")
            for row in table.find_elements_by_tag_name("tr"):
                cells = row.find_elements_by_tag_name("td")
                if len(cells) >= 2:
                    row_label = cells[0].text.strip()
                    detail_raw[row_label] = cells[1].text.strip()

        return BillDetail(
            account=str(detail_raw["Account"]),
            rate=str(detail_raw["Rate"]),
            bill_start=parse_date(detail_raw["Bill Start"]).date(),
            bill_stop=parse_date(detail_raw["Bill Stop"]).date(),
            total_kwh=self.parse_float(detail_raw["Total kWh"]),
            on_peak_kw=self.parse_float(detail_raw["On Peak KW"]),
            cost=self.parse_cost(detail_raw["Total Bill"]),
        )
Example #2
0
def test_group(graph_cases):
    """
    :type graph_cases: qmxgraph.tests.conftest.GraphCaseFactory
    """
    graph = graph_cases('2v')

    actions = ActionChains(graph.selenium)
    actions.key_down(Keys.CONTROL)
    actions.perform()

    vertex_foo, vertex_bar = graph.get_vertices()
    graph.select_vertex(vertex_foo)
    graph.select_vertex(vertex_bar)

    actions = ActionChains(graph.selenium)
    actions.key_up(Keys.CONTROL)
    actions.perform()

    # Group selected vertices
    graph.selenium.execute_script("api.group()")

    group_fill = graph.host.styles['group']['fill_color']
    group_selector = 'g>g>rect[fill="{}"]'.format(group_fill)
    group = graph.selenium.find_elements_by_css_selector(group_selector)
    assert len(group) == 1

    # Ungroup selected vertices
    graph.selenium.execute_script("api.ungroup()")
    group = graph.selenium.find_elements_by_css_selector(group_selector)
    assert not group
Example #3
0
 def scroll(self, key='end', loc=None, ele=None, strict=False, position=None, action='click'):
     key_select = ['end', 'home', 'page_up', 'page_down']
     if key not in key_select:
         LOG_ERROR('参数key: {}输入错误, 可选有效参数为: {}'.format(key, key_select))
     key_map = {
         'end': Keys.END,
         'home': Keys.HOME,
         'page_up': Keys.PAGE_UP,
         'page_down': Keys.PAGE_DOWN
     }
     if loc or ele:
         self.move_to_element_and_click(loc=loc, ele=ele, strict=strict, action=action)
     elif position:
         self.move_by_offset_and_click(xoffset=position[0], yoffset=position[1], action=action)
     else:
         actions = ActionChains(self.driver)
         if action == 'click':
             actions.click()
         elif action == 'double_click':
             actions.double_click()
         elif action == 'context_click':
             actions.context_click()
         else:
             pass
         actions.perform()
     actions = ActionChains(self.driver)
     actions.key_down(key_map[key])
     actions.key_up(key_map[key])
     actions.perform()
Example #4
0
def mouse_over_with_control(locator, x_wiggle=0):
    sl: SeleniumLibrary = BuiltIn().get_library_instance("SeleniumLibrary")
    action_chains = ActionChains(sl.driver)
    action_chains.key_down(Keys.CONTROL)
    action_chains.move_to_element(sl.find_element(locator))
    wiggle(action_chains, x_wiggle)
    action_chains.key_up(Keys.CONTROL)
    return action_chains.perform()
Example #5
0
 def click_multiple_with_ctrl_down(self, locator,numbers=5):
     
     elements = self._element_find(locator, False, True)
     actions = ActionChains(self._current_browser())
     actions.key_down(keys.Keys.CONTROL).perform()
     sampl = random.sample(elements,int(numbers))
     for e in sampl:
         e.click()
     actions.key_up(keys.Keys.CONTROL).perform()
Example #6
0
    def click_multiple_with_ctrl_down(self, locator, numbers=5):

        elements = self._element_find(locator, False, True)
        actions = ActionChains(self._current_browser())
        actions.key_down(keys.Keys.CONTROL).perform()
        sampl = random.sample(elements, int(numbers))
        for e in sampl:
            e.click()
        actions.key_up(keys.Keys.CONTROL).perform()
Example #7
0
    def test_report(self):
        self.browser.get(self.live_server_url + '/')

        # Login
        username = self.browser.find_element_by_id('username')
        username.send_keys('Jim')
        password = self.browser.find_element_by_id('password')
        # Send the wrong password
        password.send_keys('correcthorsebatterystaple')

        # Submit the form
        submit = self.browser.find_element_by_id('submit')
        submit.click()

        # Navigate to the sale page
        img = self.browser.find_element_by_xpath(
            '//div[@class="card small grey darken-3"][1]//img[@id="report-image"]')
        img.click()

        # Get the choose showing modal
        showing = self.browser.find_element_by_xpath(
            '//div[@class="col s6 center-align"][1]/button')
        showing.click()

        wait = WebDriverWait(self.browser, 10)
        element = wait.until(EC.element_to_be_clickable((By.ID, 'picker-modal')))

        modal = self.browser.find_element_by_id('picker-modal')
        self.assertTrue(modal.is_displayed())

        occ = self.browser.find_element_by_id('showing')
        occ.click()

        free_text = self.browser.find_element_by_xpath('//div[@id="sale-update"]//p').text
        self.assertIn('No tickets sold', free_text)
        self.assertIn('No tickets reserved', free_text)
        self.assertIn('80 tickets left', free_text)

        # Check selling tickets adds up properly
        pricing = models.InHousePricing.objects.get(id=1)
        member_price = pricing.member_price
        concession_price = pricing.concession_price
        public_price = pricing.public_price
        mat_f_price = pricing.matinee_freshers_price
        mat_f_nnt_price = pricing.matinee_freshers_nnt_price

        out = self.browser.find_element_by_id('out1').text

        member = self.browser.find_element_by_id('member')
        action = ActionChains(self.browser)
        action.click(on_element=member)
        action.send_keys('1')
        action.key_down(Keys.CONTROL)
        action.key_up(Keys.CONTROL)
        action.perform()
Example #8
0
    def select_files(self):
        action = ActionChains(self.driver)

        action.shift_down = lambda: action.key_down(Keys.LEFT_SHIFT)
        action.shift_up = lambda: action.key_up(Keys.LEFT_SHIFT)
        action.ctrl_down = lambda: action.key_down(Keys.LEFT_CONTROL)
        action.ctrl_up = lambda: action.key_up(Keys.LEFT_CONTROL)
        action.select = lambda item: action.click(item.web_elem)

        yield action

        action.perform()
Example #9
0
def test_add_selection_change_handler(graph_cases):
    """
    :type graph_cases: qmxgraph.tests.conftest.GraphCaseFactory
    """

    graph = graph_cases('2v_1e')
    source, target = graph.get_vertices()
    edge = graph.get_edge(source, target)

    graph.selenium.execute_script(
        'callback = function(cellIds) {'
        '    if (!window.__selectionChange__) {'
        '        window.__selectionChange__ = [];'
        '    }'
        '    window.__selectionChange__.push(cellIds);'
        '}')
    graph.eval_js_function('api.onSelectionChanged',
                           qmxgraph.js.Variable('callback'))

    # Select all cells.
    actions = ActionChains(graph.selenium)
    actions.key_down(Keys.CONTROL)
    actions.click(source)
    actions.click(target)
    actions.click(edge)
    actions.key_up(Keys.CONTROL)
    actions.perform()

    fired_selection_events = graph.selenium.execute_script(
        'return window.__selectionChange__')
    assert fired_selection_events == [
        ['2'],
        ['3', '2'],
        ['4', '3', '2'],
    ]

    assert graph.eval_js_function('api.getSelectedCells') == ['4', '3', '2']

    # Programmatically select one cell.
    graph.eval_js_function('api.setSelectedCells', ['3'])
    # Clear selection.
    graph.eval_js_function('api.setSelectedCells', [])

    fired_selection_events = graph.selenium.execute_script(
        'return window.__selectionChange__')
    assert fired_selection_events == [
        ['2'],
        ['3', '2'],
        ['4', '3', '2'],
        ['3'],
        [],
    ]
Example #10
0
def test_delete_edge(graph_cases):
    """
    :type graph_cases: qmxgraph.tests.conftest.GraphCaseFactory
    """
    graph = graph_cases('2v_1e')
    graph.select_edge(graph.get_edge(*graph.get_vertices()))

    actions = ActionChains(graph.selenium)
    actions.key_down(Keys.DELETE)
    actions.key_up(Keys.DELETE)
    actions.perform()

    assert not graph.get_edge(*graph.get_vertices())
Example #11
0
 def hold_and_press(self, modifier, keys):
     """
     This keyword use to hold the modifier key before press the keys.
     
     ``keys`` (key) : the string represent the keys.
     
     ``modifier`` (key): the key code.
     """
     modifier = self.parse_modifier(modifier)
     action = ActionChains(self.lib.driver)
     for item in modifier:
         action.key_down(item)
     action.send_keys(keys)
     for item in modifier:
         action.key_up(item)
     action.perform()
Example #12
0
    def select_files(self):
        from platform import system as get_system
        
        ctrl_or_cmd_key = \
            Keys.COMMAND if get_system() == 'Darwin' else Keys.LEFT_CONTROL
        
        action = ActionChains(self.driver)

        action.shift_down = lambda: action.key_down(Keys.LEFT_SHIFT)
        action.shift_up = lambda: action.key_up(Keys.LEFT_SHIFT)
        action.ctrl_or_cmd_down = lambda: action.key_down(ctrl_or_cmd_key)
        action.ctrl_or_cmd_up = lambda: action.key_up(ctrl_or_cmd_key)
        action.select = lambda item: action.click(item.web_elem)

        yield action

        action.perform()
Example #13
0
    def input_value(self, value, input_element=None, overwrite=True):
        print("Input value")

        mod_key = get_mod_key()

        actions = ActionChains(self.get_driver())
        if overwrite:
            actions.key_down(mod_key)
            actions.send_keys('a')
            actions.key_up(mod_key)

        actions.send_keys(Keys.DELETE)
        actions.send_keys(value)
        actions.perform()

        if input_element is not None:
            self.confirm_input(input_element)
Example #14
0
    def test_remove_success(self):
        table = self.driver.find_element_by_id('dataTable')
        self.create_units(table)

        tr = table.find_element_by_css_selector('.htCore tbody tr:nth-child(' + str(3) + ')')
        actions = ActionChains(self.driver)
        actions.move_to_element(tr.find_element_by_css_selector('td:nth-child(2)'))
        actions.click()
        actions.key_down(Keys.SHIFT)
        actions.move_to_element(table.find_element_by_css_selector('.htCore tbody tr:nth-child(' + str(5) + ') td:nth-child(3)'))
        actions.click()
        actions.key_up(Keys.SHIFT)
        actions.move_to_element(table.find_element_by_css_selector('.htCore tbody tr:nth-child(' + str(4) + ') td:nth-child(3)'))
        actions.context_click().send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN)
        actions.send_keys(Keys.RETURN)
        actions.perform()
        self.assertEqual(len(self.driver.find_elements_by_css_selector('.htCore tbody tr')), 3 * 2)
Example #15
0
    def input_value_with_copy_paste(self, value, input_element=None):
        print("Input value with copy/paste")

        mod_key = get_mod_key()

        actions = ActionChains(self.get_driver())
        actions.key_down(mod_key)
        actions.send_keys('a')
        actions.send_keys('v')
        actions.key_up(mod_key)

        current_value = pyperclip.paste()
        pyperclip.copy(value)
        actions.perform()
        pyperclip.copy(current_value)

        if input_element is not None:
            self.confirm_input(input_element)
Example #16
0
def alert(msg, whatsappTab):
    driver.switch_to.window(whatsappTab)
    child_elem = driver.find_element_by_xpath("//span[@title='" +
                                              whatsapTarget + "']")
    parent_elem = child_elem.find_element_by_xpath('./../../../../..')
    parent_elem.click()
    time.sleep(load_time)

    inputField = driver.find_element_by_css_selector('div._3F6QL._2WovP')
    msgs = msg.split(';')
    inputField.send_keys(msgs[0])
    for i in range(1, len(msgs)):
        action = ActionChains(driver)
        action.key_down(Keys.SHIFT)
        action.send_keys(Keys.ENTER)
        action.key_up(Keys.SHIFT)
        action.perform()
        inputField.send_keys(msgs[i])

    driver.find_element_by_css_selector("button._35EW6").click()
Example #17
0
 def hold_and_click(self, locator, modifier=False):
     """
     This keyword use to hold the key before click to web element(defined by locator parameter).
     
     ``locator`` (WebElement locator) : the locator to identify the element.
     
     ``modifier`` (key): the key code.
     """
     if not isinstance(modifier, (str)):
         self.lib.info("Clicking element '%s'." % locator)
         self.lib.find_element(locator).click()
     else:
         modifier = self.parse_modifier(modifier)
         action = ActionChains(self.lib.driver)
         for item in modifier:
             action.key_down(item)
         action.click(self.lib.find_element(locator))
         for item in modifier:
             action.key_up(item)
         action.perform()
Example #18
0
 def test_remove_permission(self):
     table = self.driver.find_element_by_id('dataTable')
     self.create_units(table)
     self.driver.authorize(username=self.guest.email, password='******')
     self.driver.open_url(reverse('units:list', kwargs={'lab_pk': unicode(self.lab.pk)}))
     table = self.driver.find_element_by_id('dataTable')
     tr = table.find_element_by_css_selector('.htCore tbody tr:nth-child(1)')
     actions = ActionChains(self.driver)
     actions.move_to_element(tr.find_element_by_css_selector('td:nth-child(2)'))
     actions.click()
     actions.key_down(Keys.SHIFT)
     actions.move_to_element(table.find_element_by_css_selector('.htCore tbody tr:nth-child(' + str(5) + ') td:nth-child(3)'))
     actions.click()
     actions.key_up(Keys.SHIFT)
     actions.move_to_element(table.find_element_by_css_selector('.htCore tbody tr:nth-child(' + str(4) + ') td:nth-child(3)'))
     actions.context_click().send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN)
     actions.send_keys(Keys.RETURN)
     actions.perform()
     self.assertTrue(self.driver.is_element_present('.alert-danger'))
     self.assertEqual(self.driver.find_element_by_css_selector('.messages').text, 'PERMISSION DENIED')
Example #19
0
class ActionImpl(object):
    def __init__(self):
        self.action = ActionChains(driver)

    def key_down(self, value, element=None):
        value = self.tran_value(value)
        self.action.key_down(value, element)

    def key_up(self, value, element=None):
        value = self.tran_value(value)
        self.action.key_up(value, element)

    def tran_value(self, value):
        if value == 'KEY_ENTER':
            value = Keys.ENTER
        return value

    def send_keys(self, *keys_to_send):
        self.action.send_keys(keys_to_send)

    def __del__(self):
        self.action.perform()
Example #20
0
def trigger_keystrokes(browser, *keys):
    """ Send the keys in sequence to the browser.
    Handles following key combinations
    1. with modifiers eg. 'control-alt-a', 'shift-c'
    2. just modifiers eg. 'alt', 'esc'
    3. non-modifiers eg. 'abc'
    Modifiers : http://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
    """
    for each_key_combination in keys:
        keys = each_key_combination.split('-')
        if len(keys) > 1:  # key has modifiers eg. control, alt, shift
            modifiers_keys = [getattr(Keys, x.upper()) for x in keys[:-1]]
            ac = ActionChains(browser)
            for i in modifiers_keys: ac = ac.key_down(i)
            ac.send_keys(keys[-1])
            for i in modifiers_keys[::-1]: ac = ac.key_up(i)
            ac.perform()
        else:              # single key stroke. Check if modifier eg. "up"
            browser.send_keys(getattr(Keys, keys[0].upper(), keys[0]))
Example #21
0
def trigger_keystrokes(browser, *keys):
    """ Send the keys in sequence to the browser.
    Handles following key combinations
    1. with modifiers eg. 'control-alt-a', 'shift-c'
    2. just modifiers eg. 'alt', 'esc'
    3. non-modifiers eg. 'abc'
    Modifiers : http://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
    """
    for each_key_combination in keys:
        keys = each_key_combination.split('-')
        if len(keys) > 1:  # key has modifiers eg. control, alt, shift
            modifiers_keys = [getattr(Keys, x.upper()) for x in keys[:-1]]
            ac = ActionChains(browser)
            for i in modifiers_keys: ac = ac.key_down(i)
            ac.send_keys(keys[-1])
            for i in modifiers_keys[::-1]: ac = ac.key_up(i)
            ac.perform()
        else:              # single key stroke. Check if modifier eg. "up"
            browser.send_keys(getattr(Keys, keys[0].upper(), keys[0]))
    def test_dragon_drop(self, driver, default_project, session, provider, modifier_key, action):
        current_browser = driver.desired_capabilities.get('browserName')
        node_id = default_project.id

        # Connect addon to node, upload a single test file
        node = osf_api.get_node(session, node_id=node_id)
        if provider != 'osfstorage':
            addon = osf_api.get_user_addon(session, provider)
            addon_account_id = list(addon['data']['links']['accounts'])[0]
            osf_api.connect_provider_root_to_node(session, provider, addon_account_id, node_id=node_id)
        if modifier_key == 'alt':
            file_name = 'copy_' + find_current_browser(driver) + '_' + provider + '.txt'
            new_file, metadata = osf_api.upload_fake_file(session=session, node=node, name=file_name, provider=provider)
        else:
            file_name = 'move_' + current_browser + '_' + provider + '.txt'
            new_file, metadata = osf_api.upload_fake_file(session=session, node=node, name=file_name, provider=provider)

        try:
            files_page = FilesPage(driver, guid=node_id)
            files_page.goto()

            # Find the row that contains the new file
            source_row = find_row_by_name(driver, provider, new_file)

            # Find the row with the OSF storage
            for row in files_page.fangorn_addons:
                if row.text == 'OSF Storage (United States)':
                    target = row
                    break

            action_chains = ActionChains(driver)
            action_chains.reset_actions()
            if 'chrome' in current_browser:
                # The sleeps in the following code block are needed for
                # Chrome's virtual keyboard to work properly
                if modifier_key == 'alt':
                    action_chains.key_up(Keys.LEFT_ALT).perform()
                    action_chains.key_down(Keys.LEFT_ALT).perform()
                    action_chains.click_and_hold(source_row).perform()
                    time.sleep(1)

                    action_chains.reset_actions()
                    action_chains.move_to_element(target).perform()
                    time.sleep(1)

                    action_chains.reset_actions()
                    action_chains.key_up(Keys.LEFT_ALT).perform()
                    action_chains.key_down(Keys.LEFT_ALT).perform()
                    action_chains.key_up(Keys.ALT).perform()
                    action_chains.key_down(Keys.ALT).perform()
                    action_chains.release(target).perform()
                    time.sleep(1)

                    action_chains.reset_actions()
                    action_chains.key_up(Keys.LEFT_ALT).perform()
                    action_chains.key_up(Keys.ALT).perform()

                else:
                    action_chains.click_and_hold(source_row).perform()
                    # Chrome -> will highlight multiple rows if you do not sleep here
                    time.sleep(1)
                    action_chains.move_to_element(target).perform()

                    action_chains.reset_actions()
                    action_chains.release(target).perform()
            else:
                if modifier_key == 'alt':
                    action_chains.key_down(Keys.LEFT_ALT)
                    action_chains.click_and_hold(source_row)
                    action_chains.move_to_element(target)
                    action_chains.release(target)
                    action_chains.key_up(Keys.LEFT_ALT)
                    action_chains.perform()
                else:
                    action_chains.drag_and_drop(source_row, target).perform()

            # Wait for 5 seconds for Copying message to show
            WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 'text-muted')))
            # Wait a maximum of 20 seconds for Copying message to resolve
            WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.CLASS_NAME, 'text-muted')))

            files_page.goto()
            origin_file = find_row_by_name(driver, provider, new_file)
            destination_file = find_row_by_name(driver, 'osf', new_file)

            if modifier_key == 'alt':
                # Test for copy
                assert 'copy' in origin_file.text
                assert 'copy' in destination_file.text

                osf_api.delete_file(session, metadata['data']['links']['delete'])

            else:
                # Test for move
                assert origin_file is None
                assert 'move' in destination_file.text

        finally:
            osf_api.delete_addon_files(session, provider, current_browser, guid=node_id)
Example #23
0
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
dr = webdriver.Chrome()
dr.implicitly_wait(10)
dr.get('http://www.baidu.com')
t1 = dr.find_element_by_link_text('设置')
'''
单击 click()
双击 double_click()
右击 context_click()
单击不放 click_and_drop()
拖拽  drag_and_drop()
拖动至 drag_and_drop_by_offset()
按下键盘键 key_down()
松开键盘键 key_up()
鼠标移动 move_by_offset()
鼠标移动至 mover_to_element()
松开鼠标左键 release()
'''
action = ActionChains(dr)
# action.move_to_element(t1).perform()
# t2 = dr.find_element_by_link_text('搜索设置')
# action.click(t2).perform()
action.key_up(Keys.SHIFT).key_down(Keys.SHIFT).perform()

Example #24
0
def formular():
    driver = webdriver.Firefox()
    driver.maximize_window()
    driver.get("https://www.techlistic.com/p/selenium-practice-form.html") #accesare site
    time.sleep(5)

    #enter the first and second name
    first_name = driver.find_element_by_name("firstname");
    first_name.clear()
    first_name.send_keys("Calin")

    second_name = driver.find_element_by_name("lastname")
    second_name.clear()
    second_name.send_keys("Andreea")
    time.sleep(3)

    #select radio button - gender button
    gender = driver.find_element_by_id("sex-1").click()
    time.sleep(3)

    #select years of experience
    years_experiences = driver.find_element_by_id("exp-3").click()
    time.sleep(3)

    #date
    date = driver.find_element_by_id("datepicker")
    date.clear()
    date.send_keys("19/11/2000")
    time.sleep(2)

    #select profession
    profession = driver.find_element_by_id("profession-0").click()
    time.sleep(2)

    automation_tools = driver.find_element_by_id("tool-1").click()
    time.sleep(2)

    #select continents
    continent = Select(driver.find_element_by_name("continents"))
    continent.select_by_visible_text("Europe")
    time.sleep(2)

    #selenium commands section
    commands = Select(driver.find_element_by_name("selenium_commands"))
    commands.select_by_visible_text("Wait Commands")
    a = ActionChains(driver)
    a.key_down(Keys.CONTROL)
    commands.select_by_visible_text("Switch Commands")
    time.sleep(2)
    a.key_up(Keys.CONTROL)
    time.sleep(5)

    #upload an image
    driver.find_element_by_id("photo").send_keys(os.getcwd()+"\parrots.bmp") #getcwd - calea pt folderul curent
    time.sleep(5)


    link = driver.find_element_by_partial_link_text("Click here to Download File")
    link_download = link.get_attribute("href")
    #print(link_download)
    connection_pool = urllib3.PoolManager()
    #print(link_download[0:8] + "raw.githubusercontent" + link_download[14:38] + link_download[43:])
    url_2 = link_download[0:8] + "raw.githubusercontent" + link_download[14:38] + link_download[43:]
    resp = connection_pool.request('GET', url_2)
    filename = os.path.join(os.getcwd(), 'data_download.txt')
    f = open(filename, 'wb')
    f.write(resp.data)
    f.close()
    resp.release_conn()
    time.sleep(5)

    #click submit
    driver.find_element_by_id("submit").click()
    time.sleep(3)
Example #25
0
File: basic.py Project: sutt/nbx
def basic_1(ERR_MSGS=[], TEST_FAILS=False, b_no_tear_down=False):

    d_outputs = {}

    print(f"starting basic_1...teardown: {b_no_tear_down}")

    ### Launch Notebook

    teacher_driver = webdriver.Chrome()
    student_driver = webdriver.Chrome()

    teacher_url = 'http://localhost:9200/tree?'
    student_url = 'http://localhost:9201/tree?'

    teacher_driver.get(teacher_url)
    student_driver.get(student_url)

    time.sleep(2)

    nb_name = "book1.ipynb"

    for driver in (teacher_driver, student_driver):

        links = driver.find_elements_by_class_name("item_link")

        ind_book = [i for i, link in enumerate(links)
                    if link.text == nb_name][0]

        print(ind_book)

        nb_link = links[ind_book]

        nb_link.click()
        driver.quit()

    time.sleep(1)

    ### Open Both Notebooks

    teacher_driver = webdriver.Chrome()
    student_driver = webdriver.Chrome()

    teacher_url = "http://localhost:9200/notebooks/" + nb_name
    student_url = "http://localhost:9201/notebooks/" + nb_name

    teacher_driver.get(teacher_url)
    student_driver.get(student_url)

    ### Teacher::send_answer()

    driver = teacher_driver

    for i_action, cell_num in enumerate((0, 1, 2, 3, 4)):

        class_name = "code_cell"
        elems = driver.find_elements_by_class_name(class_name)

        cell = elems[cell_num]

        inner_class = "input_area"
        inner = cell.find_element_by_class_name(inner_class)
        inner.click()

        time.sleep(0.1)

        if cell_num == 3:

            outputs_0 = get_cell_outputs(cell)

            action = ActionChains(driver)
            action.send_keys("import random;random.randint(0,1e6)")
            action.perform()

            time.sleep(0.3)

        if cell_num == 4:

            action = ActionChains(driver)
            action.send_keys("nbx.send_answer()")
            action.perform()

            time.sleep(0.3)

        action = ActionChains(driver)
        action.key_down(Keys.SHIFT)
        action.send_keys(Keys.ENTER)

        action.key_up(Keys.SHIFT)
        action.perform()

        time.sleep(0.3)

        if cell_num == 3:

            outputs_1 = get_cell_outputs(cell)

            if outputs_0 == outputs_1:
                ERR_MSGS.append(
                    "BAD JUPYTER ACTION: teacher nb test cell not executed")
                TEST_FAILS = True

    time.sleep(3)

    ### Student::receive_answer()

    driver = student_driver

    for i_action, cell_num in enumerate((0, 1, 2, 3)):

        class_name = "code_cell"
        elems = driver.find_elements_by_class_name(class_name)

        cell = elems[cell_num]

        inner_class = "input_area"
        inner = cell.find_element_by_class_name(inner_class)
        inner.click()

        time.sleep(0.1)

        if i_action == 3:

            action = ActionChains(driver)
            action.send_keys("nbx.receive_answer()")
            action.perform()

            time.sleep(0.3)

        action = ActionChains(driver)
        action.key_down(Keys.SHIFT)
        action.send_keys(Keys.ENTER)

        action.key_up(Keys.SHIFT)
        action.perform()

        time.sleep(0.3)

        if i_action == 3:

            # allow student nb reload enough to finish before checking answer cell
            time.sleep(10)

            attempts = 0
            success = False
            while (attempts < 3):
                try:
                    class_name = "code_cell"
                    elems = driver.find_elements_by_class_name(class_name)
                    cell = elems[cell_num]
                    outputs_3 = get_cell_outputs(cell)

                    if outputs_3 != outputs_1:
                        ERR_MSGS.append(
                            f"RECEIVED OUTPUT DOES NOT MATCH SENT: sent:\n{outputs_1}\nreceived:\n{outputs_3}"
                        )
                        TEST_FAILS = True

                    success = True
                    break

                except:
                    attempts += 1
                    time.sleep(1)

            if not (success):
                print("FAILED to load cells on refreshed notebook")

    ### Tear Down

    time.sleep(10)

    if not (b_no_tear_down):
        teacher_driver.quit()
        student_driver.quit()

    return ERR_MSGS, TEST_FAILS, d_outputs
Example #26
0
def browse_twitter(browser, result, count):
    """Open tweet page on twitter.com according to found tweet ID on topsy.com."""
    try:
        # save current handle in variable
        main_window = browser.current_window_handle
    except Exception as e:
        # catch if not found
        errorlog("\n{0} current_window_handle" .format(e))
        # return default value
        return [-1, -1]

    # problem of skipped tweets is handled
    # count for finding xpath is incremented, for other results than, tweets
    if count >= 6:
        count += 1
    try:
        tweet = browser.find_element_by_xpath("//*[@id='results']/div[{0}]/div/div/ul/li[1]/small/a/span[2]" .format(count))
    except:
        # if element not found return default value
        return [-1, -1]

    # action chain command + click to open twitter.com in new tab
    action = ActionChains(browser)
    action.key_down(Keys.COMMAND)
    action.click(tweet)
    action.key_up(Keys.COMMAND)
    action.perform()

    # switch to new tab control + tab
    browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

    # Different approach to handle page not loaded
    # Try
    # WebDriverWait(browser, 10).until(
    #     EC.presence_of_element_located((By.XPATH, "//*[@id='doc']"))
    # )

    # try for 3 time to find the element on page (if page load was not fast enough)
    for counter in range(3):
        if not page_has_loaded(browser, "//*[@id='doc']"):
            if counter == 2:
                # after 3 tries return default value
                browser.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w')
                browser.switch_to_window(main_window)
                return [-1, -1]
            browser.refresh()

    # get the current browser content (of new tab)
    html_source = browser.page_source
    soup = BeautifulSoup(html_source)
    # find part with retweet and favorite count number
    retweet_count = soup.find_all(class_="request-retweeted-popup")
    # try to find retweet count if not return default
    try:
        retweet_count = re.search('(?<=<strong>)\d+', str(retweet_count)).group()
    except:
        retweet_count = -1
    favorite_count = soup.find_all(class_="request-favorited-popup")
    # try to find favorite count if not return default
    try:
        favorite_count = re.search('(?<=<strong>)\d+', str(favorite_count)).group()
    except:
        favorite_count = -1

    # focus on current main page (current tab) and close command + w
    browser.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w')

    # switch focus to original (main) window handle
    browser.switch_to_window(main_window)

    return [retweet_count, favorite_count]
 def call_find_all_references_here(self):
     actions = ActionChains(self.get_driver())
     actions.key_down(Keys.SHIFT)
     actions.send_keys(Keys.F12)
     actions.key_up(Keys.SHIFT)
     actions.perform()
Example #28
0
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.suning.com")
ac = ActionChains(driver)
ele = driver.find_element_by_xpath("//*[@id='searchKeywords']")
ac.key_down("i", ele).perform()
time.sleep(2)
ac.key_up("i", ele).perform()
driver.find_element_by_xpath("//*[@id='searchSubmit']").click()
time.sleep(5)
driver.quit()
 def call_auto_complete_here(self):
     actions = ActionChains(self.get_driver())
     actions.key_down(Keys.CONTROL)
     actions.send_keys(Keys.SPACE)
     actions.key_up(Keys.CONTROL)
     actions.perform()
Example #30
0
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
action = ActionChains(driver)
action.send_keys()
action.click(on_element=None)
action.click_and_hold(on_element=None)
action.context_click(on_element=None)
action.double_click()
action.drag_and_drop(source=0, target=1)
action.drag_and_drop_by_offset(source=1, xoffset=1, yoffset=2)
action.key_down(value=0, element=None)
action.key_up(value=0, element=None)
#按下Ctrl+C并且释放
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(
    Keys.CONTROL).perform()

action.move_by_offset(10, 20)
action.move_to_element(to_element='x')

action.move_to_element_with_offset(to_element='x', xoffset=1, yoffset=2)
action.perform()
action.release(on_element='c')
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("https://demoqa.com/selectable/")
action_chains = ActionChains(driver)
time.sleep(5)
item1 = driver.find_element_by_xpath("//li[contains(text(),'Item 1')]")
item4 = driver.find_element_by_xpath("//li[contains(text(),'Item 4')]")
action_chains.key_down(Keys.LEFT_CONTROL)
action_chains.click(item1)
action_chains.click(item4)
action_chains.key_up(Keys.LEFT_CONTROL)
action_chains.perform()
time.sleep(3)
driver.quit()
Example #32
0
class Browser:
    def __init__(self):
        """
        Represents a Selenium browser object with added functions for Discord-specific purposes.
        No parameters; global settings are used from config.py.

        Methods
        -----------
        browser_login()
            Opens the browser to the Discord channel and logs in if necessary.
            Returns True if load successful.
            Raises TimeoutError if the page does not load.
            Raises ValueError if incorrect page loads.
        send_text(text)
            Send text to active channel.
        react_emoji(emoji, message_id)
            Searches and clicks an emoji button.
            Raises Exception if button was not found.
        roll(count)
            Sends the roll command for count number of times with 3 seconds between each roll.
        refresh()
            Refreshes the page.
        close()
            Closes the browser window.
        """
        # Selenium browser control here
        options = Options()
        options.add_argument('-headless')
        self.driver = webdriver.Firefox(executable_path=config.WEB_DRIVER_PATH,
                                        options=options)
        self.actions = ActionChains(self.driver)

        # Logging initialization
        self.logger = logging.getLogger(__name__)

    # Initiate browser
    def browser_login(self):
        self.logger.info('Browser thread started')
        self.logger.info('Attempting to open Discord in browser')
        self.driver.get(
            f'https://discord.com/channels/{config.SERVER_ID}/{config.CHANNEL_ID}'
        )
        try:
            email = WebDriverWait(
                self.driver,
                10).until(lambda x: x.find_element(By.NAME, 'email'))
        except TimeoutException:
            if f'{config.SERVER_ID}/{config.CHANNEL_ID}' not in self.driver.current_url:
                # No login screen, but wrong channel (some weird error)
                self.logger.critical(
                    'The channel did not load and no login was asked!')
                raise TimeoutError
        else:
            self.logger.info(
                'Logging in with provided credentials (this may take up to 30 seconds)'
            )
            email.send_keys(config.LOGIN_INFO[0])
            self.driver.find_element(By.NAME, 'password').send_keys(
                config.LOGIN_INFO[1])
            self.driver.find_element(By.XPATH,
                                     "//button[@type='submit']").click()
            try:
                # Wait for main screen
                WebDriverWait(self.driver, 30).until(lambda x: x.find_element(
                    By.CLASS_NAME, 'slateTextArea-1Mkdgw'))
                if f'{config.SERVER_ID}/{config.CHANNEL_ID}' not in self.driver.current_url:
                    # Logged in, but wrong channel (some weird error)
                    raise ValueError
            except TimeoutException or NoSuchElementException:
                self.logger.critical(
                    'Login was unsuccessful. Please check LOGIN_INFO entry in config.py'
                )
                raise TimeoutError
            except ValueError:
                self.logger.critical(
                    'Login was successful but the channel did not load')
                raise ValueError
            else:
                self.logger.info(
                    f'Login successful to server {config.SERVER_ID} and channel {config.CHANNEL_ID}'
                )
                return True

    def send_text(self, text: str):
        # For some reason, typing directly into the message box doesn't work
        # ActionChains must be used instead to type character by character
        self.actions = ActionChains(self.driver)
        self.logger.info(f'Sending text: {text}')
        try:
            message_box = WebDriverWait(
                self.driver, 1).until(lambda x: x.find_element(
                    By.CLASS_NAME, 'slateTextArea-1Mkdgw'))
        except TimeoutException:
            self.logger.warning("Discord may have crashed, refreshing page")
            self.refresh()
            return self.send_text(text)
        self.actions.click(on_element=message_box)
        for char in text:
            self.actions.key_down(char)
            self.actions.key_up(char)
        self.actions.key_down(Keys.ENTER)
        self.actions.key_up(Keys.ENTER)
        self.actions.perform()

    def react_emoji(self, emoji: str, message_id: int):
        self.logger.info(f'Attempting to click emoji: {emoji}')
        xpath = f"//div[@id='chat-messages-{message_id}']//div[@aria-label='{emoji}, press to react']"
        try:
            # Get div containing emoji
            emoji_div = WebDriverWait(
                self.driver,
                7).until(lambda x: x.find_element(By.XPATH, xpath))
            # Get current count
            count = int(
                emoji_div.find_element(
                    By.XPATH, "//div[@class='reactionCount-2mvXRV']").text)
            # Click emoji
            # WebElement.click() breaks for some reason, use javascript instead
            self.driver.execute_script('arguments[0].click();', emoji_div)

            # Check new count
            try:
                WebDriverWait(self.driver, 1) \
                    .until_not(lambda x:
                               int(x.find_element(By.XPATH,
                                                  f"{xpath}//div[@class='reactionCount-2mvXRV']").text) > count)
            except TimeoutException:  # No increase in count
                self.logger.warning(
                    'Emoji was found, but unsuccessfully clicked')
                raise TimeoutError
            else:
                self.logger.info('Emoji successfully clicked')
        except TimeoutException or NoSuchElementException:
            self.logger.critical('Unable to find the emoji to click')
            raise TimeoutError

    def add_heart(self):
        # Just type it.
        self.send_text(f'+:heart:')

    def roll(self, count: int):
        """
        Rolls for count number of times.
        """
        for _ in range(count):
            self.send_text(f'{config.COMMAND_PREFIX}{config.ROLL_COMMAND}')
            time.sleep(3)  # Sleep for 3 seconds between roll commands

    def refresh(self):
        self.driver.refresh()
        WebDriverWait(self.driver, 10).until(
            lambda x: x.find_element(By.CLASS_NAME, 'slateTextArea-1Mkdgw'))

    def close(self):
        self.driver.close()
Example #33
0
from selenium import webdriver
from selenium.webdriver import  ActionChains
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
driver.find_element_by_id("kw").click()
time.sleep(2)
ac=ActionChains(driver)
ac.key_down("z"),ac.key_up("z").perform()
time.sleep(2)
driver.quit()


Example #34
0
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time


driver = webdriver.Chrome()
driver.get("http://www.teachmeselenium.com/automation-practice")
driver.maximize_window()

action_chains = ActionChains(driver)

#Type by pressing SHIFT
driver.find_element_by_id("firstname").click()
action_chains.key_down(Keys.SHIFT)
action_chains.send_keys("testuser")
action_chains.key_up(Keys.SHIFT)
action_chains.perform()
time.sleep(2)

#Ctrl-a
action_chains.key_down(Keys.LEFT_CONTROL).send_keys("a").key_up(Keys.LEFT_CONTROL).perform()
time.sleep(2)
#Ctrl-c
action_chains.key_down(Keys.LEFT_CONTROL).send_keys("c").key_up(Keys.LEFT_CONTROL).perform()
time.sleep(2)

#Press TAB
action_chains.send_keys(Keys.TAB).perform()
time.sleep(2)

#Ctrl-v