def action_native_tap(self): if self._driver.attr.type == 'Appium': Logger.debug('启动模拟真实点击') self._driver.update_settings({'nativeWebTap': True}) with suppress(BaseException): yield Logger.debug('关闭模拟真实点击') self._driver.update_settings({'nativeWebTap': False}) else: yield
def get(self, url, https=False): if '://' not in url: if https: protocol = 'https' else: protocol = 'http' url = f'{protocol}://{url}' Logger.debug(f'自动添加{protocol}协议') Logger.debug(f'加载链接:{url}') self._driver.get(url)
def input(self, value, clear=True, stay=0.5): if not self.in_view: self.scroll_into_view(stay=stay) self.highlight() if clear: Logger.debug(f'清空输入框:{self._selector}') self._driver.execute_script('arguments[0].select();', self._element) self._element.send_keys(Keys.DELETE) time.sleep(0.5) Logger.debug(f'元素:{self._selector} 输入:{value}') self._element.send_keys(value)
def click(self, native_tap=None, stay=0.5): if not self.in_view: self.scroll_into_view(stay=stay) self.highlight() Logger.debug(f'点击元素:{self._selector}') if self._driver.attr.type == 'Selenium': if self._driver.attr.name in ['IE', 'Safari']: self._driver.execute_script('arguments[0].click();', self._element) return elif self._driver.attr.type == 'Appium' and self._driver.attr.name == 'Safari': if native_tap: with self.action_native_tap(): self._element.click() return try: self._element.click() except ElementClickInterceptedException: self.scroll_into_view(stay=stay) self._element.click()
def until_not(self, method, *args, **kwargs): while True: with Logger() as logger: with suppress(*self._exceptions): if not method(*args, **kwargs): logger.ending = True return True logger.ending = False if time.time() > self._end_time: logger.ending = True if self._message: raise AssertionError(self._message) else: return False
def page_timeout(self, wait_time): self._page_timeout = wait_time Logger.debug(f'设置页面加载超时时间:{wait_time}秒') self._driver.set_page_load_timeout(time_to_wait=wait_time)
def back(self): with self.wait_for_page_load(): Logger.debug('回返上一页') self._driver.back()
def url(self): url = self._driver.current_url Logger.debug(f'当前链接为:{url}') return url
def size(self): width, height = self._driver.get_window_size().values() Logger.debug(f'当前窗口大小为:{width} {height}') return {"width": width, "height": height}
def __call__(self, *args, **kwargs): _value = self.outer_class._get_element( self._selector).get_attribute(name) Logger.debug( f'判断元素{self._selector}的属性{name}是否包含:{value},当前值为:{_value}') return self._value == _value
def get_img(self, filename=None): if filename is None: filename = f'{round(time.time())}.png' Logger.debug(f'截图并保存到:{filename}') self._driver.get_screenshot_as_file(filename=filename) return filename
def select_by_value(self, value): if not self.in_view: self.scroll_into_view() self.highlight() Logger.debug(f'选择值为{value}的选项') Select(webelement=self._element).select_by_value(value=value)
def text(self): text = self._element.text Logger.debug(f'元素:{self._selector} 的文本为:{text}') return text
def __call__(self, *args, **kwargs): Logger.debug('判断页面是否加载完毕') return self.outer_class.execute_script('return document.readyState;') == 'complete'
def get_base64(self): Logger.debug('截图并保存为Base64格式') return self._driver.get_screenshot_as_base64()
def stop(self): Logger.debug('停止页面加载') self._driver.execute_script('window.stop();')
def __call__(self, *args, **kwargs): Logger.debug('判断是否有新窗口打开') return len(self._current_windows) != len(self.outer_class.windows)
def __call__(self, *args, **kwargs): Logger.debug(f'判断链接是否不等于:{url}') return self._url != self.outer_class.url
def __call__(self, *args, **kwargs): Logger.debug(f'判断链接是否满足正则规则:{pattern}') return re.search(self._pattern, self.outer_class.url)
def __call__(self, *args, **kwargs): Logger.debug('判断弹窗是否显示') with suppress(NoAlertPresentException): alert = self.outer_class._driver.switch_to.alert return alert return False
def close(self): Logger.debug('关闭标签页') self._driver.close()
def quit(self): Logger.debug('退出浏览器') self._driver.quit()
def select_by_index(self, index): if not self.in_view: self.scroll_into_view() self.highlight() Logger.debug(f'选择第{index}选项') Select(webelement=self._element).select_by_index(index=index)
def forward(self): with self.wait_for_page_load(): Logger.debug('前往下一页') self._driver.forward()
def select_by_text(self, text): if not self.in_view: self.scroll_into_view() self.highlight() Logger.debug(f'选择文本为:{text}的选项') Select(webelement=self._element).select_by_visible_text(text=text)
def refresh(self): with self.wait_for_page_load(): Logger.debug('刷新页面') self._driver.refresh()
def attr(self, name): value = self._element.get_attribute(name=name) Logger.debug(f'元素:{self._selector} 的属性{name}值为:{value}') return value
def title(self): title = self._driver.title Logger.debug(f'当前标题为:{title}') return title
def __call__(self, *args, **kwargs): _text = self.outer_class._get_element(self._selector).text Logger.debug( f'判断元素{self._selector}的文本是否包含:{text},当前文本为:{_text}') return self._text == _text
def minimize(self): if self._driver.attr.type == 'Selenium': Logger.debug('窗口最小化') self._driver.minimize_window()