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"]), )
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
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()
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()
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()
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()
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()
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()
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'], [], ]
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())
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()
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()
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)
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)
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)
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()
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()
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')
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()
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)
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()
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)
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
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()
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()
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()
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()
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()
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