예제 #1
0
    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()
예제 #2
0
    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()
예제 #3
0
 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
예제 #4
0
 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)
예제 #5
0
 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)
예제 #6
0
 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()
예제 #7
0
 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)
예제 #8
0
 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)
예제 #9
0
 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
예제 #10
0
 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)
예제 #11
0
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)