def click_element_on_center_by_offset(self, selector, x_offset=0, y_offset=0, by=By.CSS_SELECTOR): """ 点击指定元素相对中心偏移量的位置 参数: selector: 上传文件的元素 x_offset: X偏移量,默认值为0 y_offset: Y偏移量,默认值为0 by: 元素定位方式,默认为By.CSS_SELECTOR,可选By.XPATH """ page_actions.wait_for_element_visible(self.driver, selector, by=by) element = self.driver.find_element(by=by, value=selector) width = element.size.get('width') height = element.size.get('height') actions = ActionChains(self.driver) actions.move_to_element(element) actions.perform() self.sleep(1) actions.move_by_offset(x_offset, y_offset) actions.perform() self.sleep(1) actions.click() actions.perform()
def hover_on_element_by_xpath(self, selector): """ 通过XPath悬停鼠标在指定元素上 参数: selector: 元素XPath """ page_actions.wait_for_element_visible(self.driver, selector, by=By.XPATH) element = self.driver.find_element(by=By.XPATH, value=selector) actions = ActionChains(self.driver).move_to_element(element) actions.perform()
def get_text(self, selector, by=By.CSS_SELECTOR, timeout=settings.SMALL_TIMEOUT): element = page_actions.wait_for_element_visible( self.driver, selector, by, timeout) return element.text
def wait_for_element_visible(self, selector, by=By.CSS_SELECTOR, timeout=settings.LARGE_TIMEOUT): """ Waits for an element to appear in the HTML of a page. The element must be visible (it cannot be hidden). """ if selector.startswith('/') or selector.startswith('./'): by = By.XPATH return page_actions.wait_for_element_visible( self.driver, selector, by, timeout)
def wait_for_element_visible(self, selector, by=By.CSS_SELECTOR, timeout=settings.LARGE_TIMEOUT): """ Waits for an element to appear in the HTML of a page. The element must be visible (it cannot be hidden). """ if selector.startswith('/') or selector.startswith('./'): by = By.XPATH return page_actions.wait_for_element_visible(self.driver, selector, by, timeout)
def click(self, selector, by=By.CSS_SELECTOR, timeout=settings.SMALL_TIMEOUT): if selector.startswith('/') or selector.startswith('./'): by = By.XPATH element = page_actions.wait_for_element_visible( self.driver, selector, by, timeout=timeout) self._demo_mode_scroll_if_active(selector, by) element.click() if settings.WAIT_FOR_RSC_ON_CLICKS: self.wait_for_ready_state_complete() self._demo_mode_pause_if_active()
def click(self, selector, by=By.CSS_SELECTOR, timeout=settings.SMALL_TIMEOUT): if selector.startswith('/') or selector.startswith('./'): by = By.XPATH element = page_actions.wait_for_element_visible( self.driver, selector, by, timeout=timeout) self._demo_mode_highlight_if_active(selector, by) pre_action_url = self.driver.current_url element.click() if settings.WAIT_FOR_RSC_ON_CLICKS: self.wait_for_ready_state_complete() if self.demo_mode: if self.driver.current_url != pre_action_url: self._demo_mode_pause_if_active() else: self._demo_mode_pause_if_active(tiny=True)
def click(self, selector, by=By.CSS_SELECTOR, timeout=settings.SMALL_TIMEOUT): if selector.startswith('/') or selector.startswith('./'): by = By.XPATH element = page_actions.wait_for_element_visible(self.driver, selector, by, timeout=timeout) self._demo_mode_highlight_if_active(selector, by) pre_action_url = self.driver.current_url element.click() if settings.WAIT_FOR_RSC_ON_CLICKS: self.wait_for_ready_state_complete() if self.demo_mode: if self.driver.current_url != pre_action_url: self._demo_mode_pause_if_active() else: self._demo_mode_pause_if_active(tiny=True)
def wait_for_element_visible(self, selector, by=By.CSS_SELECTOR, timeout=settings.LARGE_TIMEOUT): if selector.startswith('/') or selector.startswith('./'): by = By.XPATH return page_actions.wait_for_element_visible( self.driver, selector, by, timeout)
def play_driverjs_tour( driver, tour_steps, browser, msg_dur, name=None, interval=0 ): """Plays a DriverJS tour on the current website.""" instructions = "" for tour_step in tour_steps[name]: instructions += tour_step instructions += """] ); // Start the tour! tour.start(); $tour = tour;""" autoplay = False if interval and interval > 0: autoplay = True interval = float(interval) if interval < 0.5: interval = 0.5 if not is_driverjs_activated(driver): activate_driverjs(driver) if len(tour_steps[name]) > 1: try: if "element: " in tour_steps[name][1]: selector = re.search( r"[\S\s]+element: '([\S\s]+)',[\S\s]+popover: {", tour_steps[name][1], ).group(1) selector = selector.replace("\\", "").replace(":first", "") page_actions.wait_for_element_present( driver, selector, by=By.CSS_SELECTOR, timeout=settings.SMALL_TIMEOUT, ) else: selector = "html" except Exception: js_utils.post_messenger_error_message( driver, "Tour Error: {'%s'} was not found!" % selector, msg_dur ) raise Exception( "Tour Error: {'%s'} was not found! " "Exiting due to failure on first tour step!" "" % selector ) driver.execute_script(instructions) driver.execute_script( 'document.querySelector(".driver-next-btn").focus();' ) tour_on = True if autoplay: start_ms = time.time() * 1000.0 stop_ms = start_ms + (interval * 1000.0) latest_step = 0 while tour_on: try: time.sleep(0.01) if browser != "firefox": result = not driver.execute_script("return $tour.isActivated") else: page_actions.wait_for_element_visible( driver, "#driver-popover-item", by=By.CSS_SELECTOR, timeout=1.1, ) result = False except Exception: tour_on = False result = None if result is False: tour_on = True driver.execute_script( 'document.querySelector(".driver-next-btn").focus();' ) if autoplay: try: current_step = driver.execute_script( "return $tour.currentStep" ) except Exception: continue if current_step != latest_step: latest_step = current_step start_ms = time.time() * 1000.0 stop_ms = start_ms + (interval * 1000.0) now_ms = time.time() * 1000.0 if now_ms >= stop_ms: if current_step == latest_step: driver.execute_script("$tour.moveNext()") try: latest_step = driver.execute_script( "return $tour.currentStep" ) start_ms = time.time() * 1000.0 stop_ms = start_ms + (interval * 1000.0) except Exception: pass continue else: try: time.sleep(0.01) if browser != "firefox": result = not driver.execute_script( "return $tour.isActivated" ) else: page_actions.wait_for_element_visible( driver, "#driver-popover-item", by=By.CSS_SELECTOR, timeout=1.1, ) result = False if result is False: time.sleep(0.1) continue else: return except Exception: tour_on = False time.sleep(0.1)