def find_one(self,type,type_text,timeout=10,poll_frequency=0.5): ''' 功能:查找元素,返回查找到的元素 :param type: 根据那种类型查找元素 :param value: 可以定位的元素的值 :return: 查找到的元素本身 ''' sel_type = type.lower() try: if sel_type == 'id': return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.ID,type_text))) elif sel_type == 'xpath': return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.XPATH,type_text))) elif sel_type == 'class_name': return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.CLASS_NAME,type_text))) elif sel_type == 'tag_name': return WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located((By.TAG_NAME, type_text))) elif sel_type == 'link_text': return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.LINK_TEXT,type_text))) elif sel_type == 'partial_link_text': return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT,type_text))) else: raise Exception("find_one - 类型{}不存在".format(type)) except exception.TimeoutException: raise exception.TimeoutException("find_one - 超时")
def popup(browser, element, timeout=10): initial_window = browser.current_window_handle initial_windows = browser.window_handles time_elapsed = 0 # Click to open the poup element.click() new_window = None while not new_window: new_window = [ x for x in browser.window_handles if x not in initial_windows ] if not new_window: time.sleep(2) time_elapsed += 2 if time_elapsed > timeout: raise exceptions.TimeoutException( 'Popup doesnt open in specified time') browser.switch_to_window(new_window) yield browser # Closes the new window if new_window in browser.window_handles: browser.switch_to_window(new_window) browser.close() # Back to initial window browser.switch_to_window(initial_window)
def localizar_boton_perfil_usuario(driver: WebDriver, timeout: int = 7): tiempo_limite = Temporizador.obtener_tiempo_timer() + timeout while Temporizador.obtener_tiempo_timer() < tiempo_limite: # verifica si encontro folder en caso de estar en plataforma OWA 2013 if ValidacionesHTML.verificar_elemento_encontrado_por_xpath( driver, constantes_webdriver_actions. CERRAR_SESION_BTN_PERFIL_USUARIO_OWA_2013): return driver.find_element_by_xpath( constantes_webdriver_actions. CERRAR_SESION_BTN_PERFIL_USUARIO_OWA_2013) # verifica si encontro folder en caso de estar en plataforma OWA 2016 elif ValidacionesHTML.verificar_elemento_encontrado_por_xpath( driver, constantes_webdriver_actions. CERRAR_SESION_BTN_PERFIL_USUARIO_OWA_2016): return driver.find_element_by_xpath( constantes_webdriver_actions. CERRAR_SESION_BTN_PERFIL_USUARIO_OWA_2016) raise SelExcept.TimeoutException( msg= 'No fue posible localizar el boton de perfil del usuario dentro de la ' 'plataforma')
def waitforclickable(self, target, timeout): wait = WebDriverWait(self, timeout) try: wait.until( expected_conditions.element_to_be_clickable((By.ID, target))) except selenium_errors.TimeoutException: raise selenium_errors.TimeoutException( 'Element {0} not found'.format(target)) logger.info('Element {0} found'.format(target))
def test_load_url_adds_timeout_error_to_result(self): mock_driver = mock.Mock(spec=browser_client_common.webdriver.Firefox) errors = [] mock_driver.get.side_effect = exceptions.TimeoutException( 'dummy exception') self.assertFalse(browser_client_common.load_url( mock_driver, 'http://fake.url/foo', errors)) self.assertErrorMessagesEqual( ['Timed out waiting for page to load.', 'Failed to load URL: http://fake.url/foo'], errors)
def waitfor(self, target, timeout): wait = WebDriverWait(self, timeout) try: wait.until( expected_conditions.visibility_of_element_located( (By.ACCESSIBILITY_ID, target))) except selenium_errors.TimeoutException: raise selenium_errors.TimeoutException( 'Element {0} not found'.format(target)) logger.info('Element {0} found'.format(target))
def switch_alert(self,timeout=10,poll_frequency=0.5): ''' 功能:返回找到的alert元素 :param timeout: :param poll_frequency: :return:alert元素 ''' try: return WebDriverWait(self.driver,timeout,poll_frequency).until(EC.alert_is_present()) except exception.TimeoutException: raise exception.TimeoutException("switch_alert - 超时没有找到alert元素")
def switch_iframe(self,iframe,timeout=10,poll_frequency=0.5): ''' 功能:如果有iframe并且可以切换,则切换过去 :param iframe: iframe元素 :param timeout: :param poll_frequency: :return: ''' try: WebDriverWait(self.driver,timeout,poll_frequency).until(EC.frame_to_be_available_and_switch_to_it(iframe)) except exception.TimeoutException: raise exception.TimeoutException("switch_iframe - 超时没有找到指定的iframe元素")
def test_wait_until_element_is_visible_returns_false_when_wait_times_out( self, mock_webdriver_wait): mock_webdriver_wait.side_effect = exceptions.TimeoutException( 'mock timeout exception') # In reality, these would be objects, but we mock with strings for # simplicity. mock_driver = 'mock driver' mock_element = 'mock DOM element' # Verify that the function returns False when the wait times out. self.assertFalse(browser_client_common.wait_until_element_is_visible( mock_driver, mock_element, 20))
def wait_for_exist(self, locator, wait_frequency=20, wait_second=.5): """ :Usage: driver.wait_for_exist('id=something') """ for _ in range(wait_frequency): if self.is_element_exist(locator): return time.sleep(wait_second) else: raise exceptions.TimeoutException( f'wait for {wait_frequency * wait_second}s but element does not exist' )
def wait_for_displayed(self, wait_frequency=20, wait_second=.5): """ :Usage: element.wait_for_displayed() """ for i in range(wait_frequency): if self.is_displayed(): return time.sleep(wait_second) else: raise exceptions.TimeoutException( f'wait for {wait_frequency * wait_second}s but element does not display' )
def elementwait(self, method, message=''): """ 搜索元素 """ if time.time() > self._end_time: raise exceptions.TimeoutException(message) else: try: value = method(self._driver) if value: return value except exceptions.NoSuchElementException: time.sleep(self._interval_time) return self.elementwait(method)
def get(self, url, can_retry=True): if can_retry: tries = 10 else: tries = 1 while tries > 0: tries -= 1 self._tester.driver.get(url) if 'The website may be down' in self._tester.driver.page_source: time.sleep(5) continue return raise exceptions.TimeoutException( 'Timeout waiting for %s page to load', url)
def elementdisplay(self, message=''): """ 等待页面加载 """ flag = self._driver.execute_script("return document.readyState") while True: if flag == "complete": return True else: time.sleep(self._interval_time) flag = self._driver.execute_script( "return document.readyState") if time.time() > self._end_time: break raise exceptions.TimeoutException(message)
def test_test_records_error_when_run_test_button_is_not_in_dom( self, mock_ui): mock_wait_driver = mock.Mock() mock_wait_driver.until.side_effect = exceptions.TimeoutException( 'mock_timeout') mock_ui.WebDriverWait.return_value = mock_wait_driver result = self.banjo.perform_test() self.assertIsNone(result.latency) self.assertIsNone(result.s2c_result.throughput) self.assertIsNone(result.c2s_result.throughput) self.assertErrorMessagesEqual( [banjo_driver.ERROR_FAILED_TO_LOCATE_RUN_TEST_BUTTON], result.errors)
def until(self, method, message=''): """ 对定位元素进行操作 :param method:方法(建议用lambda函数) :param message:报错信息 """ if time.time() > self._end_time: raise exceptions.TimeoutException(message) else: try: value = method(self._driver) if value: return value except exceptions.WebDriverException: time.sleep(self._interval_time) return self.until(method)
def localizar_enlace_cierre_sesion_owa_2010(driver: WebDriver, timeout: int = 7): tiempo_limite = Temporizador.obtener_tiempo_timer() + timeout while Temporizador.obtener_tiempo_timer() < tiempo_limite: # verifica si encontro folder en caso de estar en plataforma OWA 2013 if ValidacionesHTML.verificar_elemento_encontrado_por_id( driver, constantes_webdriver_actions. CERRAR_SESION_CIERRE_SESION_ID_BTN_CIERRE_SESION_OWA_2010): return driver.find_element_by_id( constantes_webdriver_actions. CERRAR_SESION_CIERRE_SESION_ID_BTN_CIERRE_SESION_OWA_2010) raise SelExcept.TimeoutException( msg= 'No fue posible localizar el boton de cierre de sesion dentro de la ' 'plataforma')
def obtener_carpeta_con_timeout(driver: WebDriver, nombre_de_la_carpeta: str, timeout: int = 7): tiempo_limite = Temporizador.obtener_tiempo_timer() + timeout while Temporizador.obtener_tiempo_timer() < tiempo_limite: # verifica si encontro folder en caso de estar en plataforma OWA 2010 if ValidacionesHTML.verificar_elemento_encontrado_por_xpath( driver, constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2010.format( nombre_de_la_carpeta)): return driver.find_element_by_xpath( constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2010.format( nombre_de_la_carpeta)) elif ValidacionesHTML.verificar_elemento_encontrado_por_xpath( driver, constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2013.format( nombre_de_la_carpeta)): return driver.find_element_by_xpath( constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2013.format( nombre_de_la_carpeta)) elif ValidacionesHTML.verificar_elemento_encontrado_por_xpath( driver, constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2016.format( nombre_de_la_carpeta)): return driver.find_element_by_xpath( constantes_webdriver_actions. NAVEGACION_CARPETAS_SEG_XPATH_CARPETA_OWA_2016.format( nombre_de_la_carpeta)) raise SelExcept.TimeoutException( msg='No fue posible localizar la carpeta dentro de la plataforma')
def el_click(self,type,type_text,timeout=10,poll_frequency=0.5): ''' 功能:click方法 :param type: 查找元素的方式 :param type_text: 元素的特有属性值 ''' sel_type = type.lower() try: if sel_type == 'id': WebDriverWait(self.driver,timeout,poll_frequency).until(EC.element_to_be_clickable((By.ID,type_text))).click() elif sel_type == 'xpath': WebDriverWait(self.driver,timeout,poll_frequency).until(EC.element_to_be_clickable((By.XPATH,type_text))).click() elif sel_type == 'class_name': WebDriverWait(self.driver,timeout,poll_frequency).until(EC.element_to_be_clickable((By.CLASS_NAME,type_text))).click() elif sel_type == 'tag_name': WebDriverWait(self.driver, timeout, poll_frequency).until(EC.element_to_be_clickable((By.TAG_NAME, type_text))).click() elif sel_type == 'link_text': WebDriverWait(self.driver,timeout,poll_frequency).until(EC.element_to_be_clickable((By.LINK_TEXT,type_text))).click() elif sel_type == 'partial_link_text': WebDriverWait(self.driver,timeout,poll_frequency).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT,type_text))).click() else: raise Exception("el_click - 类型{}不存在".format(type)) except exception.TimeoutException: raise exception.TimeoutException("el_click - 超时")
def _swipe_on_screen(self, locator: tuple = None, swipe_max: int = 10, swipe_type: str = 'down', timeout: float = None) -> None: def _touch_action(start_x: int, end_x: int, start_y: int, end_y: int, ms: int = 200) -> None: self.touch_action. \ press(x=start_x, y=start_y). \ wait(ms=ms). \ move_to(x=end_x, y=end_y). \ release(). \ perform() def _swipe_to(k_start: float, k_end: float) -> None: size = self.driver.get_window_size() x = int(size['width'] / 2) start_y = int(size['height'] * k_start) end_y = int(size['height'] * k_end) _touch_action(x, x, start_y, end_y) if swipe_type == 'up': # Переместить экран вверх. _swipe_to(0.4, 0.6) elif swipe_type == 'down': # Переместить экран вниз. _swipe_to(0.6, 0.4) elif swipe_type == 'to_element': # Переместить экран к элементу. count_swipes = 0 while len(self.driver.find_elements(*locator)) == 0: if count_swipes > swipe_max: raise exceptions.TimeoutException( f'Unable to navigate to element: {locator}.') self._swipe_on_screen() count_swipes += 1 elif swipe_type == 'middle': # Переместить элемент в центр. element = self.find_element(locator=locator, timeout=timeout) start_x = element.rect['x'] upper_y = element.rect['y'] lower_y = upper_y + element.rect['height'] middle_y = (upper_y + lower_y) / 2 middle_device_width = self.driver.get_window_size()['width'] / 2 _touch_action(start_x, middle_device_width, middle_y, middle_y) else: raise UndefinedSwipeType( f'Got type: {swipe_type}. Expected: up, down, to_element, middle.' )
def click(self, locator, timeout=0): """Check element visibility of element and click it.""" if self.is_element_displayed(locator, timeout): self.driver.find_element(locator).click() else: raise ex.TimeoutException("Element not displayed")
res = sock.recv(1024) # 收到消息后关闭套接字,并解码出url sock.close() task_url = res.decode("utf-8") # --------------------------- 网页爬取部分 --------------------------- # print("正在爬取网页:", task_url) cnt = 0 # 尝试3次连接 while cnt < 3: try: driver.get(task_url) break except exceptions.TimeoutException: cnt += 1 if cnt == 3: raise exceptions.TimeoutException("timeout") print("超时,重试爬取:", task_url) time.sleep(2) time.sleep(1) # 用lxml.etree和XPath解析页面 selector = etree.HTML(driver.page_source) article = { "title": selector.xpath(__XPATHS__["title"])[0], "time": selector.xpath(__XPATHS__["time"])[0], "author": selector.xpath(__XPATHS__["author"])[0], "tags": selector.xpath(__XPATHS__["tags"])[0].split(","), "url": selector.xpath(__XPATHS__["url"])[0], "content": "" } # 处理文章内容,保证换行正确 arti_content = selector.xpath(__XPATHS__["content"])
def mock_text_to_be_present_in_element(_, text): if self.timeout_by_text[text]: raise exceptions.TimeoutException('mock timeout')