def interactionWithAlerts(self, accept=True): alert_element = WebDriverWait(self.driver, 10).until(EC.alert_is_present()) alert_text = alert_element.text print(alert_text) if accept is True: alert_element.accept() else: alert_element.dismiss()
def search_car(): current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) search_box_car = driver.find_element_by_id("ip_car") search_box_car.send_keys(car_num) search_box_car.send_keys(Keys.RETURN) try: alert = WebDriverWait(driver, timeout=2).until(EC.alert_is_present()) except: print("%s: search car success" %(current_time), flush=True) else: print("%s: search car error, %s" %(current_time, alert.text), flush=True) alert.dismiss()
def by_alert(): driver = webdriver.Chrome('C:/WebDriver/bin/chromedriver.exe') driver.get("https://antycaptcha.amberteam.pl:5443/stf/3-8-1?seed=000c0514-8b72-4558-9998-f68d954e84a7") driver.find_element(By.ID, "showAlert").click() alert = WebDriverWait(driver, 20).until(EC.alert_is_present()) alert = driver.switch_to.alert text = alert.text alert.dismiss() driver.find_element(By.ID, "alertText").send_keys(text) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "solution"))).click() time.sleep(1) result = driver.find_elements(By.CSS_SELECTOR, "code") return result[1].text
def discount(discount_type): # discount type: 1 == 10min, 2 == 30min, 3 == 1hour current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) try: driver.find_element_by_xpath('//*[@id="dc_items"]/label[%s]/input' %(discount_type)).click() driver.find_element_by_id("DC_Active").click() alert = WebDriverWait(driver, timeout=2).until(EC.alert_is_present()) except: if discount_type == 3: print("%s: 1 hour discount success" %(current_time), flush=True) elif discount_type == 2: print("%s: 30 minute discount success" %(current_time), flush=True) elif discount_type == 1: print("%s: 10 minute discount success" %(current_time), flush=True) else: print("%s: discount error, %s" %(current_time, alert.text), flush=True) alert.dismiss()
def test_by_alert(): driver = webdriver.Chrome('C:/WebDriver/bin/chromedriver.exe') driver.get("https://antycaptcha.amberteam.pl:5443") driver.find_element(By.CSS_SELECTOR, ".row:nth-child(15) .u-full-width").click() driver.find_element(By.ID, "showAlert").click() alert = WebDriverWait(driver, 20).until(EC.alert_is_present()) alert = driver.switch_to.alert text = alert.text alert.dismiss() driver.find_element(By.ID, "alertText").send_keys(text) WebDriverWait(driver, 20).until(EC.element_to_be_clickable( (By.ID, "solution"))).click() time.sleep(1) result = driver.find_elements(By.CSS_SELECTOR, "code") assert "OK. Good answer" in result[1].text driver.quit()
def startStep(self): start = datetime.datetime.now() try: self.find_element_list = [] browser_step_id = self.get('browser_step_id') browser_step = self.case.getStep(step_id=browser_step_id) driver = browser_step.getDriver() command = self.get('command') frame = self.get('frame') wait = self.get('wait') enter = self.get('auto_enter') command_target = self.get('command_target', '').replace("\\", "") value = self.get('value') if value: ref_option = 'Eval | {}'.format(value) value = self.applyRefOption(value, ref_option) if command == 'Alert': try: activity = self.get('activity') #time.sleep(1) #alert = driver.switch_to.alert alert = WebDriverWait(driver, 1).until(EC.alert_is_present()) if activity == 'Accept': alert.accept() else: alert.dismiss() except NoAlertPresentException: pass elif command == 'Switch to Frame': self.findElements(driver, command_target) self.switchFrame(driver, frame) elif command == 'Switch to Default': driver.switch_to_default_content() else: while True: try: WebDriverWait(driver, 0).until( EC.element_to_be_clickable( (By.ID, '___processbar2_i'))) except: break driver.switch_to.default_content() self.findElements(driver, command_target) self.find_element_list = sorted(self.find_element_list, key=lambda k: k['full_frame'], reverse=True) self.switchFrame(driver, frame) role = driver.execute_script( "return {}.getAttribute('role')".format(command_target)) if command in ['Click', 'Type', 'find', 'Grid Click']: target = WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.ID, command_target))) target_style = driver.execute_script( "return document.getElementById('{id}').getAttribute('style')" .format(id=command_target)) driver.execute_script( "document.getElementById('{target}').setAttribute('style', '{add_style}' + 'border: 2px solid red !important; text-shadow: 2px 2px 10px yellow;')" .format(target=command_target, add_style=target_style)) #driver.implicitly_wait(1.5) driver.execute_script( "document.getElementById('{target}').setAttribute('style', '{add_style}')" .format(target=command_target, add_style=target_style)) # Swing Grid를 Access 하기 위한 정보 조회 if command in ['Grid Type', 'Grid Click', 'Grid Double Click']: row_index = self.get('row_index') col = self.get('column') col_index = driver.execute_script(''' var headerList = %s.getDomList("head_tds", "th", %s.getElementById(%s.id + "_head_table")); var arr = Array.prototype.slice.call(headerList) var find_arr = arr.find(event => event.getAttribute('value') !==null && event.getAttribute('value').replace(/ /gi, "").toUpperCase() === %s.replace(/ /gi, "").toUpperCase()) var index = -1 if (find_arr != null){ index = find_arr.getAttribute('colindex') } return index ''' % (command_target, command_target, command_target, '''"{}"'''.format(col))) if type(row_index) == int: pass else: row_index_column = row_index["column"] row_index_value = row_index["value"] column_id = driver.execute_script( "return {target}.getColumnID({col})".format( target=command_target, col=row_index_column)) row_index = driver.execute_script( "return {target}.getMatchedIndex('{column_id}', '{value}', true)[0]" .format(target=command_target, column_id=column_id, value=row_index_value)) if int(col_index) > -1 and row_index: grid_element_id = driver.execute_script(''' var headerList = %s.getDomList("body_trs", "tr", %s.getElementById(%s.id + "_body_tbody")); var arr = Array.prototype.slice.call(headerList[%ld].children) var find_arr = arr.find(event => event.getAttribute('colindex')=== %s) var id = '' if (find_arr != null){ id = find_arr.getAttribute('id') } return id ''' % (command_target, command_target, command_target, row_index, '''"{}"'''.format(col_index))) else: grid_element_id = '{target}_cell_{row}_{col}'.format( target=command_target, row=row_index, col=col) col_index = col if role == "gridcell": command_target = "{}.firstElementChild".format( command_target) if command == 'Click': driver.execute_script('{}.click()'.format(command_target)) elif command == 'Type': #driver.execute_script("document.getElementById('{id}').value='{value}'".format(id=command_target, value=value)) driver.execute_script("{id}.setValue('{value}')".format( id=command_target, value=value)) if enter: target.send_keys(Keys.ENTER) elif command == 'Execute Script': script = self.get('value').replace("\\", "") if script: script = self.getVariableValue(script) driver.execute_script(script) elif command == 'Grid Click': try: child_type = driver.execute_script( "return {target}.firstElementChild.getAttribute('type')" .format(target=grid_element_id)) if child_type == 'button': driver.execute_script( "{target}.firstElementChild.click()".format( target=grid_element_id)) else: driver.execute_script('{target}.click()'.format( target=grid_element_id)) except: driver.execute_script( '{target}.click()'.format(target=grid_element_id)) elif command == 'Grid Double Click': cell_dblclick_event_info = driver.execute_script( "return {target}.userEventList.find(event => event.name === 'oncelldblclick')" .format(target=command_target)) if cell_dblclick_event_info: cell_dblclick_event = cell_dblclick_event_info[ "param"]["handler"] scope_id = driver.execute_script( "return {target}.scope_id".format( target=command_target)) if scope_id: cell_dblclick_event = scope_id + '_' + cell_dblclick_event ''' Lov 공통 Popup 화면(ZNGMSPOP90040_wframe)의 Double Click 이벤트 ZNGMSPOP90040_wframe_scwin.grdLov_oncelldblclick (row, col) 는 입력받은 row, col과 상관없이 현재 체크된 값 (grdLov.getCheckedJSON(0)) 을 Return 하도록 되어있어 Click 이벤트로 Focus 이동 후 Double Click 이벤트를 진행함 ''' if scope_id == 'ZNGMSPOP90040_wframe': driver.execute_script( '{target}.click()'.format( target=grid_element_id)) driver.execute_script( 'eval({event}({row}, {col}))'.format( event=cell_dblclick_event, row=row_index, col=col_index)) else: driver.execute_script( '{target}.click()'.format(target=grid_element_id)) elif command == 'Grid Type': value = self.get('value') driver.execute_script( '{target}.firstElementChild.click()'.format( target=grid_element_id)) if value: set_row = grid_element_id.split('_')[2] set_col = grid_element_id.split('_')[3] driver.execute_script( "ngmf.setGridCellData({target}, {row}, {col}, '{value}')" .format(target=command_target, row=set_row, col=set_col, value=value)) elif command == 'Combo Click': item_list = driver.execute_script( "return {}.itemArr".format(command_target)) index = next(idx for idx, item in enumerate(item_list) if item['label'] == value) driver.execute_script('{target}_button.click()'.format( target=command_target, index=index)) driver.execute_script( '{target}_itemTable_{index}.click()'.format( target=command_target, index=index)) elif command == 'find': pass ''' Browser Command 수행 후 화면에 Progressbar가 수행중이면 Loop 수행 - Aleart가 존재하면 Skip ''' try: driver.switch_to_alert() except NoAlertPresentException: driver.switch_to_default_content() while True: try: WebDriverWait(driver, 0).until( EC.element_to_be_clickable( (By.ID, '___processbar2_i'))) except: break self.setStatus(0, '정상적으로 처리가 완료되었습니다.') except UnexpectedAlertPresentException: self.setStatus(0, '정상적으로 처리가 완료되었습니다.') except NoSuchWindowException as e: if command == 'Click': self.setStatus(0, '정상적으로 처리가 완료되었습니다.') else: self.setStatus(1, str(e)) except Exception as e: if self.getErrOption() == 'Skip': self.setStatus(999, str(e)) else: self.setStatus(1, str(e)) finally: end = datetime.datetime.now() time_delta = end - start self.info['exec_time'] = str(time_delta)
class BasePage(): def __init__(self, driver, path=None): self.url = URL # self.driver = webdriver.Chrome() self.driver = driver self.driver.maximize_window() self.load_page(path) self.timeout = 15 self.poll_frequency = 0.2 def load_page(self, path=None): if path == None: self.url = None elif isinstance(path, str) and path[0] == '/': url = self.url + path print(url) else: raise TypeError('path must be a string ,path must be a uri') if path != None: self.driver.get(url) # def by_css(self, css): # locator = (By.CSS_SELECTOR, css) # self.wait_element_visibility_of_element_located(locator) # return self.driver.find_element(*locator) def by_xpath(self, xpath, text=None): locator = (By.XPATH, xpath) self.wait(locator, text) return self.driver.find_element(*locator) def wait_element_visibility_of_element_located(self, locator): WebDriverWait(self.driver, self.timeout, self.poll_frequency).until( EC.visibility_of_element_located(locator)) def wait_text_to_be_present_in_element(self, locator, text): WebDriverWait(self.driver, self.timeout, self.poll_frequency).until( EC.text_to_be_present_in_element(locator, text)) def wait_text_to_be_present_in_element_value(self, locator, text): WebDriverWait(self.driver, self.timeout, self.poll_frequency).until( EC.text_to_be_present_in_element_value(locator, text)) def by_css(self, css, text=None): locator = (By.CSS_SELECTOR, css) # self.wait_element_visibility_of_element_located(locator) self.wait(locator, text) return self.driver.find_element(*locator) def wait(self, locator, text=None): if text == None: self.wait_element_visibility_of_element_located(locator) else: self.wait_text_to_be_present_in_element(locator, text) def switch_to_frame(self, choose_iframe=None, css=None, xpath=None): if choose_iframe == 'default': return self.driver.switch_to.default_content() elif choose_iframe == 'parent': return self.driver.switch_to.parent_frame() elif css != None and xpath == None: locator = (By.CSS_SELECTOR, css) elif xpath != None and css == None: locator = (By.XPATH, xpath) else: raise ValueError('参数错误,请传css定位或者xpath,需要指定用什么方式传') WebDriverWait(self.driver, self.timeout, self.poll_frequency).until( EC.frame_to_be_available_and_switch_to_it(locator)) def select_by(self, element, by, value): if by == 'index': s = Select(element).select_by_index(int(value)) elif by == 'value': s = Select(element).select_by_value(value) elif by == 'text': s = Select(element).select_by_visible_text(value) else: raise ValueError("Not found %s , You can enter 'index', 'value', 'text'." % by) return s def switch_to_alert(self): self.alert = WebDriverWait(self.driver, self.timeout, self.poll_frequency).until(EC.alert_is_present()) def alert_text(self): return self.alert.text def alert_accept(self): return self.alert.accept() def alert_dismiss(self): return self.alert.dismiss()
# 수업 목록 table을 얻어옴 table_xpath = '//*[@id="ilbanGangjwaStud"]' tbody_xpath = table_xpath + '/tbody/' # HELP 강의실로 이동 goto_classHome = tbody_xpath + '/tr[' + str( LECTURE_ORDER) + ']/td[9]/span/input' goto_classHome = WebDriverWait(driver, SLEEP_TIME).until( EC.presence_of_element_located((By.XPATH, goto_classHome))) goto_classHome.send_keys('\n') # 연구실 안전교육 이수 알림창 닫기 try: alert = WebDriverWait(driver, SLEEP_TIME).until(EC.alert_is_present()) alert.dismiss() except: # 알림창이 열리지않음 = 이수완료. 성실하시군요 print 'Alert Skipped.' # 강의홈 로딩 time.sleep(SLEEP_TIME) driver.switch_to_window(driver.window_handles[1]) # 좌측 강의 버튼 누르기 goto_lecturePage = WebDriverWait(driver, SLEEP_TIME).until( EC.presence_of_element_located((By.XPATH, '//li[1]/span/a'))) goto_lecturePage.send_keys('\n') for page_count in range(1, LECTUREROOM_PAGE + 1):
def test_conditions(self): self.login('xxx', 'xxx') # 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0 # WebDriverWait(driver, time).until(EC.visibility_of_element_located(locator) # locator:一组,(by, locator) e_xpath = '//*[@id="pl_content_account"]/div[1]/form/fieldset/div' edit_button = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, e_xpath))) edit_button.click() # 判断某个元素中是否可见并且是enable的,以便确定元素是可点击的。此方法返回定位到的元素 # WebDriverWait(driver, time).until(EC.element_to_be_clickable(locator)) # locator:一组(by, locator) hm_xpath = '//*[@id="pl_content_account"]/div[1]/div[2]/div/div[8]/div[3]/div/select/option[3]' print(self.driver.find_element_by_xpath(hm_xpath).is_displayed()) print(self.driver.find_element_by_xpath(hm_xpath).is_enabled()) WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.XPATH, hm_xpath))).click() # 判断某个元素是否被选中了,一般用在下拉列表:WebDriverWait(driver, time).until(EC.element_to_be_selected(element) # element:是个WebElement # hm_xpath_other = '//*[@id="pl_content_account"]/div[1]/div[2]/div/div[8]/div[3]/div/select/option[8]' subsciption = self.driver.find_element_by_xpath(hm_xpath) WebDriverWait(self.driver, 20).until(EC.element_to_be_selected(subsciption)) # 判断是否至少有1个元素存在于dom树中 # 举个例子,如果页面上有n个元素的class都是‘column-md-3‘,那么只要有1个元素存在,这个方法就返回True # WebDriverWait(driver, time).until(EC.presence_of_all_elements_located(locator)) # locator:一组(by, locator) WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'btns'))) self.driver.find_element_by_xpath(e_xpath).click() # 判断某个元素是否被加到了dom树里,并不代表该元素一定可见 # WebDriverWait(driver, time).until(EC.presence_of_element_located(locator)) # locator:一组(by, locator) WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'woman_radio'))) WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.ID, 'woman_radio'))) WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.ID, 'woman_radio'))).click() woman_radio = self.driver.find_element_by_id('woman_radio') WebDriverWait(self.driver, 10).until(EC.element_to_be_selected(woman_radio)) # 判断某个元素中的text是否 包含 了预期的字符串 # WebDriverWait(driver, time).until(EC.text_to_be_present_in_element(locator, text)) # locator:一组(by, locator),即定位方法 # text:期望的值 locator = (By.XPATH, '//*[@id="pl_content_account"]/div[1]/div[1]/div[2]/div[2]') text = '笙囚' print(EC.text_to_be_present_in_element(locator, text)) WebDriverWait(self.driver, 10).until(EC.text_to_be_present_in_element(locator, text)) # 判断当前页面的title是否包含预期字符串,返回布尔值 # WebDriverWait(driver, time).until(EC.title_contains(title)) # title:期望的模糊title print(EC.title_contains('个人资料')) WebDriverWait(self.driver, 10).until(EC.title_contains('个人资料')) # 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值 # WebDriverWait(driver, 10).until(EC.title_is(title)) # title:期望的精确title print(EC.title_is('个人资料页个人信息')) WebDriverWait(self.driver, 10).until(EC.title_is('个人资料页个人信息')) # 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0 # WebDriverWait(driver, 10).until(EC.visibility_of(element) # element:是个WebElement visibility_element = self.driver.find_element_by_id('pl_content_account') print(EC.visibility_of(visibility_element)) WebDriverWait(self.driver, 10).until(EC.visibility_of(visibility_element)) # 判断某个元素中是否不存在于dom树或不可见 # WebDriverWait(driver,10).until(EC.invisibility_of_element_located(locator) # locator:一组(by, locator) print(EC.invisibility_of_element_located((By.ID, 'btns'))) WebDriverWait(self.driver, 10).until(EC.invisibility_of_element_located((By.ID, 'btns'))) # 判断页面上是否存在alert # WebDriverWait(driver, 10).until(EC.alert_is_present()) self.driver.get('file:///' + os.path.abspath('alert_prompt.html')) self.driver.find_element_by_xpath('/html/body/button').click() alert = WebDriverWait(self.driver, 10).until(EC.alert_is_present()) print(alert.text) alert.dismiss()