browser.find_element_by_xpath("//input[@id='Submit']").click() logging.info('[get_baidu_tongji_cookie] 4. vcode submit after.') try: wait.until(lambda browser: browser.find_element_by_xpath( '''//*[@id="QuestionSelect"]|//*[@id='site-summary']/table''')) except TimeoutException: logging.error('[get_baidu_tongji_cookie] vcode auth failed!') if browser.current_url.find('cas.baidu.com/?action=login') > 0: browser.quit() return '' try: ## 4.1 phone authorize if need ui.Select( browser.find_element_by_xpath( "//*[@id='QuestionSelect']")).select_by_value('100000000') browser.find_element_by_xpath( "//*[@id='QuestionInput']").send_keys(phone) browser.find_element_by_xpath( "//*[@id='uc-sec-confirm-btn']").click() logging.info('[get_baidu_tongji_cookie] 5. need phone auth.') except NoSuchElementException, e: logging.info('[get_baidu_tongji_cookie] 5. not need phone auth.') ## 5. login try: wait.until(lambda browser: browser.find_element_by_xpath( "//*[@id='site-summary']/table")) except TimeoutException: logging.error('[get_baidu_tongji_cookie] after auth failed!')
# os.mkdir(save_dir + "url_and tags_" + str(i)) # os.mkdir(dir_path) p = 0 for div in divs: if down_count == i: break i = i + 1 dir_path = save_dir + "image_" + str(i) url_xpath = "/html/body/table/tbody/tr[1]/td/table/tbody/tr/td/table[6]/tbody/tr[1]/td/div/div[" + str( i) + "]/div/a" driver.find_element_by_xpath(url_xpath).click() dropdown_menu = UI.Select(driver.find_element_by_name("formats")) a = 0 while a < len(file_type): b = 0 for option in dropdown_menu.options: formats = str(option.text).split(" ")[0] if file_type[a] == formats: option.click() break b = b + 1 if b < len(dropdown_menu.options): break a = a + 1 if a < len(file_type): os.mkdir(dir_path)
from selenium import webdriver import time import selenium.webdriver.support.ui as UI driver = webdriver.Chrome() # Open the desired web page driver.get('http://juliemr.github.io/protractor-demo/') # Type in numbers for operation first_number = driver.find_element_by_css_selector('[ng-model=first]') first_number.send_keys('10') second_number = driver.find_element_by_css_selector('[ng-model=second]') second_number.send_keys('100') # Select the operation to be performed operation_add = UI.Select( driver.find_element_by_css_selector( '[ng-model=operator]')).select_by_value("MODULO") # Click on the button to perform operation result_button = driver.find_element_by_class_name('btn') result_button.click() # Await operation to be performed time.sleep(4) result = driver.find_element_by_class_name('ng-binding') # Assert operation result and finish browser instance assert result.text == '10' driver.quit()
def main(): parser = argparse.ArgumentParser( description='This command will record a VClass page') parser.add_argument('-u', '--url', type=str, required=True, help='URL of vclass') parser.add_argument('-d', '--duration', type=float, required=True, help='Duration of class in minutes') args = parser.parse_args() SOURCE_DIR = os.path.abspath(os.path.dirname(__file__)) BASE_DIR = os.path.dirname(SOURCE_DIR) download_path = os.path.join( BASE_DIR, 'downloads', datetime.now().isoformat() + '--' + ''.join(random.choices(string.ascii_lowercase, k=10))) os.mkdir(download_path) chrome_options = Options() chrome_options.add_extension(os.path.join(SOURCE_DIR, 'skyroom.crx')) chrome_options.add_experimental_option( "prefs", { "download.default_directory": download_path, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True }) chrome_options.add_argument("--no-sandbox") chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument("disable-infobars") logger.info('Opening google chrome') driver = None for retry_number in range(10): try: if driver: logger.info('Driver is not none, close it.') driver.close() except Exception as e: logger.exception(e) try: driver = webdriver.Chrome(options=chrome_options) driver.implicitly_wait(10) time.sleep(2) driver.maximize_window() time.sleep(1) driver.maximize_window() break except Exception as e: logger.exception(e) logger.info('Create new window for not closing browser') for retry_number in range(10): try: if len(driver.window_handles) < 2: driver.execute_script("window.open('about:blank', 'tab2');") time.sleep(2 * (retry_number + 1)) break except Exception as e: logger.exception(e) logger.info('Configure skyroom extension') for retry_number in range(10): try: if len(driver.window_handles) > 1: driver.switch_to.window(driver.window_handles[0]) driver.get("chrome-extension://" "pejdnafppnpfimpnipdkiidjancinenc/options.html") ui.Select(driver.find_element_by_id( 'video_bitrate')).select_by_value('1000') ui.Select(driver.find_element_by_id( 'audio_bitrate')).select_by_value('32') driver.find_element_by_id('btnSave').click() time.sleep(2 * (retry_number + 1)) break except Exception as e: logger.exception(e) logger.info('Open vclass') for retry_number in range(10): try: driver.switch_to.window(driver.window_handles[0]) driver.get(args.url) time.sleep(2 * (retry_number + 1)) break except Exception as e: logger.exception(e) logger.info('Login as guest') for retry_number in range(10): try: force_refresh(driver) time.sleep(5 * retry_number) goto_class(driver) driver.find_element_by_xpath("//input[@class='full-width']") driver.execute_script( "document.querySelector('.dlg-nickname .full-width').value" " = 'ضبط کنندهی خودکار';") driver.execute_script( "document.querySelector('.dlg-nickname .btn').click();") break except Exception as e: logger.exception(e) logger.info('Start record') for retry_number in range(10): try: open_skyroom_popup() if not is_tab_in_recording(): if not pyautogui.pixelMatchesColor(*START_RECORDING_ICON, (255, 0, 0)): close_skyroom_popup() raise Exception('Recording red color not found :|') pyautogui.click(*START_RECORDING_ICON) time.sleep(5) if not pyautogui.pixelMatchesColor(*BETWEEN_PAUSE_AND_STOP_ICON, (245, 245, 245)): raise Exception('I can not see pause and stop icon!') if not is_tab_in_recording(): raise Exception('Tab blue recording icon can not be seen!') close_skyroom_popup() break except Exception as e: logger.exception(e) logger.info('Recording is started, watch for freeze detection!') end_time = datetime.now() + timedelta(minutes=args.duration) old_screenshot = cv2.imdecode( np.frombuffer(driver.get_screenshot_as_png(), np.uint8), -1) while datetime.now() < end_time: for retry_number in range(10): try: cur_screenshot = cv2.imdecode( np.frombuffer(driver.get_screenshot_as_png(), np.uint8), -1) similarity = ssim(old_screenshot, cur_screenshot, multichannel=True) if similarity > 0.98: logger.info('Screenshots are too similar, refresh!') force_refresh(driver) goto_class(driver) break except Exception as e: logger.exception(e) time.sleep( max(0, min(300, (end_time - datetime.now()).total_seconds()))) old_screenshot = cur_screenshot logger.info('Time is over, stop recording') for retry_number in range(10): try: time.sleep(5 * retry_number) if is_tab_in_recording(): open_skyroom_popup() if not pyautogui.pixelMatchesColor(*STOP_RECORDING_ICON, (0, 0, 0)): raise Exception('I can not see stop recording black icon') pyautogui.click(*STOP_RECORDING_ICON) time.sleep(5) close_skyroom_popup() if is_tab_in_recording(): raise Exception('I stop recording but tab is in recording :|') if len(driver.window_handles) < 2: raise Exception('Recording window is not open :(') break except Exception as e: logger.exception(e) # download file for retry_number in range(10): try: time.sleep(5) driver.switch_to.window(driver.window_handles[1]) time.sleep(0.5) driver.find_element_by_id('download').click() time.sleep(5 * (1 + retry_number)) if not pyautogui.pixelMatchesColor(*CENTER_OF_DOWNLOAD_BAR, (255, 255, 255)): raise Exception('I can not see download bar') break except Exception as e: logger.exception(e) # close windows for retry_number in range(100): try: if len(os.listdir(download_path)) == 0 or not os.listdir( download_path)[0].endswith('.webm'): raise Exception('Downloaded file can not be found!') time.sleep(5 * (1 + retry_number)) break except Exception as e: logger.exception(e) for retry_number in range(100): try: driver.switch_to.window(driver.window_handles[0]) driver.close() time.sleep(3) driver.switch_to.window(driver.window_handles[0]) driver.close() break except Exception as e: logger.exception(e) # webm to mp4 webm_file = os.path.join(download_path, os.listdir(download_path)[0]) new_webm_file = os.path.join(download_path, 'video.webm') os.rename(webm_file, new_webm_file) ffmpeg.input(new_webm_file).output( os.path.join(download_path, 'video.mp4'), **{ 'vcodec': 'h264', 'acodec': 'mp3', }).run()
from selenium import webdriver import time import selenium.webdriver.support.ui as UI driver = webdriver.Chrome() # Open the desired web page driver.get('http://juliemr.github.io/protractor-demo/') # Type in numbers for operation first_number = driver.find_element_by_css_selector('[ng-model=first]') first_number.send_keys('22') second_number = driver.find_element_by_css_selector('[ng-model=second]') second_number.send_keys('14') # Select the operation to be performed operation_add = UI.Select( driver.find_element_by_css_selector( '[ng-model=operator]')).select_by_value("MULTIPLICATION") # Click on the button to perform operation result_button = driver.find_element_by_class_name('btn') result_button.click() # Await operation to be performed time.sleep(4) result = driver.find_element_by_class_name('ng-binding') # Assert operation result and finish browser instance assert result.text == '308' driver.quit()
def _get_credit_card_transactions(self, account, start, end): browser = self._browser logger.info('Opening credit cards overview...') self._go_to_assets() cc_tile = self._get_tile_by_title('Credit card') fetch.find_element_by_title(cc_tile, 'Detailed overview').click() self._wait_to_finish_loading() content = browser.find_element_by_class_name('detail_page') logger.debug('Finding credit card account...') # Switch to tab for that account. for tab in content.find_elements_by_css_selector('tab-wrapper'): if tab.text.endswith(account.name[-4:]): tab.find_element_by_tag_name('a').click() # Verify that the correct card is displayed. active_pane = content.find_element_by_css_selector( 'section.js-tabs--pane.is-active') formatted_account_name = fetch.format_cc_account_name(account.name) if formatted_account_name not in active_pane.text: raise fetch.FetchError('Couldn\'t find account %s.' % account) # You can see the transactions for one month/period at a time. transactions = [] while True: self._wait_to_finish_loading() # Get the period of the current page. date_select_el = content.find_element_by_css_selector( '.buttons select') date_select = ui.Select(date_select_el) period = date_select.first_selected_option.text if period == 'Current accounting period': # Just use "now", which is an inaccurate hack, but works for our # purposes. start_date = end_date = datetime.datetime.now() else: match = self._CREDIT_CARD_DATE_RANGE_PATTERN.search(period) if match: start_date_str = match.group(1) end_date_str = match.group(2) start_date = datetime.datetime.strptime( start_date_str, self._DATE_FORMAT) end_date = datetime.datetime.strptime( end_date_str, self._DATE_FORMAT) else: raise fetch.FetchError( 'Not a credit card transactions page %s.' % account.name) logger.debug('Current period: ' + period) transactions_on_page = self._extract_cc_transactions() transactions += transactions_on_page logger.debug('Found %i transactions on the current page.' % len(transactions_on_page)) # Are we done yet? if start_date <= start: logger.info('Should have loaded enough transaction pages.') break else: logger.debug('Adding marker transaction for page break.') if transactions: transactions.append( model.Payment(transactions[-1].date, amount=0, memo='[Next billing cycle]')) # Load earlier transactions. next_option = date_select_el.find_element_by_xpath( "option[text() = '%s']/following-sibling::option" % period) if not next_option: logger.info('No more earlier transactions.') break logger.info('Loading earlier transactions page...') date_select.select_by_value(next_option.get_attribute('value')) self._wait_to_finish_loading() # Filter the transactions for the requested date range. logger.debug('Found %i transactions before filtering for date range.' % len(transactions)) transactions = filter(lambda t: start <= t.date < end, transactions) # They should be sorted in reverse chronological order already, but # let's make this explicit. transactions.sort(key=lambda t: t.date, reverse=True) logger.info('Found %i transactions.' % len(transactions)) self._close_tile() return transactions
def _select_dropdown(self, value, element): select = Support.Select(element) select.select_by_visible_text(value)
def _select_dropdown_by_value(self, value, element): select = Support.Select(element) select.select_by_value(value)
def _get_dropdown_options(self, element): select = Support.Select(element) return select.options
def element(self): select = self._get_element(*self._element_locator) return Support.Select(select)
def set_select_element(self, element, val): """A method for selecting an option in the select element on the page.""" element = ui.Select(element) return element.select_by_visible_text(val)
def element(self): return Support.Select(self.src_elem)
def _select_dropdown_visible_text(driver, field_id, value): menu = WebDriverWait(driver, 3).until( EC.presence_of_element_located((By.ID, field_id))) dropdown = ui.Select(menu) dropdown.select_by_visible_text(value)