From 7b3a8f5d7fc7ab3373f255a5602f9d38540fb4ef Mon Sep 17 00:00:00 2001 From: g1879 Date: Wed, 11 Nov 2020 17:46:29 +0800 Subject: [PATCH] 1.5.0 --- README.zh-cn.md | 1260 +++++++++++++++++++++++++++-------------------- 1 file changed, 735 insertions(+), 525 deletions(-) diff --git a/README.zh-cn.md b/README.zh-cn.md index f9ce31a..2034a84 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -18,11 +18,19 @@ DrissionPage,即driver和session的合体,是个基于python的Web自动化 **联系邮箱:** g1879@qq.com -# 背景 +# 理念及背景 *** -爬虫面对须要登录的网站,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。获取数据时,若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。 +## 理念 + +**简洁、易用 、可扩展** + + + +## 背景 + +requests爬虫面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。 使用selenium,可以很大程度上绕过这些坑,但selenium效率不高。因此,这个库将selenium和requests合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。 除了合并两者,本库还以网页为单位封装了常用功能,简化了selenium的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。 一切从简,尽量提供简单直接的使用方法,对新手更友好。 @@ -31,80 +39,16 @@ DrissionPage,即driver和session的合体,是个基于python的Web自动化 *** +- 以简洁的代码为第一追求。 - 允许在selenium和requests间无缝切换,共享session。 -- 兼容selenium代码,易于迁移。 -- 使用POM模式封装常用方法,便于扩展。 -- 两种模式提供统一的操作方法,使用体验一致。 -- 人性化的页面元素操作方法,减轻页面分析工作量和编码量。 -- 对某些常用功能(如点击)作了优化,更符合实际使用需要。 +- 两种模式提供一致的API,使用体验一致。 +- 人性化的页面元素操作方式,减轻页面分析工作量和编码量。 +- 对常用功能作了整合和优化,更符合实际使用需要。 +- 兼容selenium代码,便于项目迁移。 +- 使用POM模式封装,便于扩展。 +- 统一的文件下载方法,弥补浏览器下载的不足。 - 简易的配置方法,摆脱繁琐的浏览器配置。 -# 理念 - -*** - -## 简洁、易用 、可扩展 - -- DrissionPage以简洁的代码为第一追求,对selenium冗长的语句做了精简,并完全保留了其功能。 -- DrissionPage封装了许多常用功能,使用更便捷。 -- DrissionPage的核心是个页面类,可直接派生子类页面,适应各种场景须要。 -- 简易的浏览器配置方法,摆脱繁琐的设置。 - -以下代码实现一模一样的功能,对比两者的代码量: - -1. 用显性等待方式查找所有文本包含some text的元素 - -```python -# selenium: -element = WebDriverWait(driver).until(ec.presence_of_all_elements_located((By.XPATH, '//*[contains(text(), "some text")]'))) - -# DrissionPage: -element = page('some text') -``` - -2. 跳转到第一个标签页 - -```python -# selenium -driver.switch_to.window(driver.window_handles[0]) - -# DrissionPage -page.to_tab(0) -``` - -3. 拖拽一个元素 - -```python -# selenium -ActionChains(driver).drag_and_drop(ele1, ele2).perform() - -# DrissionPage -ele1.drag_to(ele2) -``` - -4. 滚动窗口到底部(保持水平滚动条不变) - -```python -# selenium -driver.execute_script("window.scrollTo(document.documentElement.scrollLeft,document.body.scrollHeight);") - -# DrissionPage -page.scroll_to('bottom') -``` - -5. 设置headless模式 - -```python -# selenium -options = webdriver.ChromeOptions() -options.add_argument("--headless") - -# DrissionPage -set_headless() -``` - - - # 项目结构 *** @@ -115,7 +59,170 @@ set_headless() *** -例:用selenium登录网站,然后切换到requests读取网页。 +## 与selenium代码对比 + +以下代码实现一模一样的功能,对比两者的代码量: + +- 用显性等待方式查找所有文本包含some text的元素 + +```python +# 使用selenium: +element = WebDriverWait(driver).until(ec.presence_of_all_elements_located((By.XPATH, '//*[contains(text(), "some text")]'))) + +# 使用DrissionPage: +element = page('some text') +``` + + + +- 跳转到第一个标签页 + +```python +# 使用selenium: +driver.switch_to.window(driver.window_handles[0]) + +# 使用DrissionPage: +page.to_tab(0) +``` + + + +- 按文本选择下拉列表 + +```python +# 使用selenium: +from selenium.webdriver.support.select import Select +select_element = Select(element) +select_element.select_by_visible_text('text') + +# 使用DrissionPage: +element.select('text') +``` + + + +- 拖拽一个元素 + +```python +# 使用selenium: +ActionChains(driver).drag_and_drop(ele1, ele2).perform() + +# 使用DrissionPage: +ele1.drag_to(ele2) +``` + + + +- 滚动窗口到底部(保持水平滚动条不变) + +```python +# 使用selenium: +driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);") + +# 使用DrissionPage: +page.scroll_to('bottom') +``` + + + +- 设置headless模式 + +```python +# 使用selenium: +options = webdriver.ChromeOptions() +options.add_argument("--headless") + +# 使用DrissionPage: +set_headless() +``` + + + +- 获取伪元素内容 + +```python +# 使用selenium: +text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");', element) + +# 使用DrissionPage: +text = element.after +``` + + + +- 获取shadow-root + +```python +# 使用selenium: +shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element) + +# 使用DrissionPage: +shadow_element = element.shadow_root +``` + + + +- 用xpath获取属性或节点 + +```python +# 使用selenium: +不支持该用法 + +# 使用DrissionPage: +class_name = element('xpath://div[@id="div_id"]/@class') +text = element('xpath://div[@id="div_id"]/text()[2]') +``` + + + +## 与requests代码对比 + +以下代码实现一模一样的功能,对比两者的代码量: + +- 获取元素内容 + +```python +url = 'https://baike.baidu.com/item/python' + +# 使用requests: +from lxml import etree +headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} +response = requests.get(url, headers = headers) +html = etree.HTML(response.text) +element = html.xpath('//h1')[0] +title = element.text + +# 使用DrissionPage: +page = MixPage('s') +page.get(url) +title = page('tag:h1').text +``` + +Tips: DrissionPage自带默认headers + + + +- 下载文件 + +```python +url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' +save_path = r'C:\download' + +# 使用requests: +r = requests.get(url) +with open(f'{save_path}\\img.png', 'wb') as fd: + for chunk in r.iter_content(): + fd.write(chunk) + +# 使用DrissionPage: +page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突 +``` + + + +## 模式切换 + +用selenium登录网站,然后切换到requests读取网页。两者会共享登录信息。 ```python page = MixPage() # 创建页面对象,默认driver模式 @@ -136,26 +243,43 @@ print('登录后title:', page.title, '\n') # 登录后session模式的输出 -例:获取并打印属性 +## 获取并打印元素属性 ```python +# 接上段代码 foot = page.ele('@id:footer-left') # 用id查找元素 first_col = foot.ele('css:>div') # 使用css selector在元素的下级中查找元素(第一个) lnk = first_col.ele('text:命令学') # 使用文本内容查找元素 text = lnk.text # 获取元素文本 href = lnk.attr('href') # 获取元素属性值 -print(first_col) -print(text, href) +print(text, href, '\n') + +# 简洁模式串联查找 +text = page('@id:footer-left')('css:>div')('text:命令学').text +print(text) ``` 输出: ``` - Git 命令学习 https://oschina.gitee.io/learn-git-branching/ + +Git 命令学习 ``` + + +## 下载文件 + +```python +url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' +save_path = r'C:\download' +page.download(url, save_path) +``` + + + # 安装 *** @@ -270,33 +394,108 @@ MixPage须接收一个Drission对象并使用其中的driver或session,如没 Tips: 多页面对象协同工作时,记得手动创建Drission对象并传递给页面对象使用。否则页面对象会各自创建自己的Drission对象,使信息无法传递。 -```python -# 创建MixPage对象的方法 -page = MixPage() # 自动创建Drission对象,driver模式,建议只在单页面对象情况下使用 -page = MixPage('s') # 以session模式快速创建,自动创建Drission对象 +### 创建对象 -page = MixPage(drission) # 以传入Drission对象创建 +创建对象方式有3种:简易、传入Drission对象、传入配置。可根据实际需要选择。 + +```python +# 简易创建方式,以ini文件默认配置自动创建Drission对象 +page = MixPage() +page = MixPage('s') + +# 以传入Drission对象创建 +page = MixPage(drission) page = MixPage(drission, mode='s', timeout=5) # session模式,等待时间5秒(默认10秒) -# 访问URL -page.get(url, **kwargs) +# 以传入配置信息创建 +page = MixPage(driver_options=DriverOption, session_options=SessionOption) # 默认 d 模式 +``` + + + +### 访问网页 + +若连接出错,程序会自动重试2次,可指定重试次数和等待间隔。 + +```python +# 默认方式 +page.get(url) page.post(url, data, **kwargs) # 只有session模式才有post方法 -# 切换模式 -page.change_mode() +# 指定重试次数和间隔 +page.get(url, retry=5, interval=0.5) +``` -# 操作页面 -print(page.html) # 页面源代码 -page.run_script(js) # 运行js语句 + + +### 切换模式 + +在 s 和 d 模式之间切换,切换时会自动同步cookies和正在访问的url + +```python +page.change_mode(go=False) # go为False表示不跳转url +``` + + + +### 页面属性 + +```python +page.url # 当前访问的url +page.mode # 当前模式 +page.drission # 当前使用的Dirssion对象 +page.driver # 当前使用的WebDirver对象 +page.session # 当前使用的Session对象 +page.cookies # 获取cookies信息 +page.html # 页面源代码 +page.title # 当前页面标题 + +# d 模式独有: +page.tabs_count # 返回标签页数量 +page.tab_handles # 返回所有标签页handle列表 +page.current_tab_num # 返回当前标签页序号 +page.current_tab_handle # 返回当前标签页handle +``` + + + +### 页面操作 + +调用只属于 d 模式的方法,会自动切换到 d 模式。详细用法见APIs + +```python +page.change_mode() # 切换模式 +page.cookies_to_session() # 从WebDriver对象复制cookies到Session对象 +page.cookies_to_driver() # 从Session对象复制cookies到WebDriver对象 +page.get(url, retry, interval, **kwargs) # 用get方式访问网页,可指定重试次数及间隔时间 +page.ele(loc_or_ele, timeout) # 获取符合条件的第一个元素、节点或属性 +page.eles(loc_or_ele, timeout) # 获取所有符合条件的元素、节点或属性 +page.download(url, save_path, rename, file_exists, **kwargs) # 下载文件 +page.close_driver() # 关闭 WebDriver对象 +page.close_session() # 关闭 Session对象 + +# s 模式独有: +page.post(url, data, retry, interval, **kwargs) # 以post方式访问网页,可指定重试次数及间隔时间 + +# d 模式独有: +page.wait_ele(loc_or_ele, mode, timeout) # 等待元素从dom删除、显示、隐藏 +page.run_script(js, *args) # 运行js语句 +page.create_tab(url) # 新建并定位到一个标签页,该标签页在最后面 +page.to_tab(num_or_handle) # 跳转到标签页 +page.close_current_tab() # 关闭当前标签页 page.close_other_tabs(num) # 关闭其它标签页 page.to_iframe(iframe) # 切入iframe page.screenshot(path) # 页面截图 page.scrool_to_see(element) # 滚动直到某元素可见 -# 详见APIs... +page.scroll_to(mode, pixel) # 按参数指示方式滚动页面,可选滚动方向:'top', 'bottom', 'rightmost', 'leftmost', 'up', 'down', 'left', 'right' +page.refresh() # 刷新当前页面 +page.back() # 浏览器后退 +page.et_window_size(x, y) # 设置浏览器窗口大小,默认最大化 +page.check_page() # 检测页面是否符合预期 +page.chrome_downloading() # 获取chrome正在下载的文件列表 +page.process_alert(mode, text) # 处理提示框 ``` -Tips:调用只属于driver模式的方法,会自动切换到driver模式。 - ## 查找元素 @@ -351,6 +550,9 @@ element.parent # 父元素 element.next # 下一个兄弟元素 element.prev # 上一个兄弟元素 +# 获取shadow-dom,只支持open的shadow-root +ele1 = element.shadow_root.ele('tag:div') + # 串连查找 page.ele('@id:ele_id').ele('tag:div').next.ele('some text').eles('tag:a') @@ -361,33 +563,57 @@ ele2 = ele1('tag:li') -## 元素操作 +## 获取元素属性 ```python -# 获取元素信息 -element = page.ele('@id:ele_id') -element = page('@id:ele_id') # 与上一句效果相同 element.html # 返回元素内html -element.text # 返回元素内去除html标签后的text值 element.tag # 返回元素tag name +element.text # 返回元素innerText值 +element.texts() # 返回元素内所有直接子节点的文本,包括元素和文本节点,可指定只返回文本节点 element.attrs # 返回元素所有属性的字典 -element.attr('class') # 返回元素的class属性 -element.is_valid # driver模式独有,用于判断元素是否还可用 +element.attr(attr) # 返回元素指定属性的值 +element.css_path # 返回元素绝对css路径 +element.xpath # 返回元素绝对xpath路径 +element.parent # 返回元素父元素 +element.next # 返回元素后一个兄弟元素 +element.prev # 返回元素前一个兄弟元素 +element.parents(num) # 返回第num级父元素 +element.nexts(num, mode) # 返回后面第几个元素或节点 +element.prevs(num, mode) # 返回前面第几个元素或节点 +element.ele(loc_or_str, timeout) # 返回当前元素下级第一个符合条件的子元素、属性或节点文本 +element.eles(loc_or_str, timeout) # 返回当前元素下级所有符合条件的子元素、属性或节点文本 -# 操作元素 -element.click() # 点击元素 -element.input(text) # 输入文字 -element.run_script(js) # 运行js -element.submit() # 提交表单 +# driver模式独有: +element.before # 获取伪元素before内容 +element.after # 获取伪元素after内容 +element.is_valid # 用于判断元素是否还在dom中 +element.size # 获取元素大小 +element.location # 获取元素位置 +element.shadow_root # 获取元素下的ShadowRoot元素 +element.get_style_property(style, pseudo_ele) # 获取元素样式属性值,可获取伪元素的 +element.is_selected() # 返回元素是否被选中 +element.is_enabled() # 返回元素是否可用 +element.is_displayed() # 返回元素是否可见 +``` + + + +## 元素操作 + +元素操作为 d 模式独有,调用以下方法会自动切换到 d 模式。 + +```python +element.click(by_js) # 点击元素,可选择是否用js方式点击 +element.input(value) # 输入文本 +element.run_script(js) # 对元素运行JavaScript脚本 +element.submit() # 提交 element.clear() # 清空元素 -element.is_selected() # 是否被选中 -element.is_enabled() # 是否可用 -element.is_displayed() # 是否可见 -element.is_valid() # 是否有效,用于判断页面跳转导致元素失效的情况 -element.select(text) # 选中下拉列表选项 -element.set_attr(attr,value) # 设置元素属性 -element.size # 元素大小 -element.location # 元素位置 +element.screenshot(path, filename) # 对元素截图 +element.select(text) # 根据文本选择下拉列表 +element.set_attr(attr, value) # 设置元素属性值 +element.drag(x, y, speed, shake) # 拖动元素相对距离,可设置速度和是否随机抖动 +element.drag_to(ele_or_loc, speed, shake) # 拖动元素到另一个元素或某个坐标,可设置速度和是否随机抖动 +element.hover() # 在元素上悬停鼠标 ``` @@ -406,6 +632,8 @@ page = MixPage(Drission(driver)) # 把driver传递给Drission,创建MixPage print(page.title) # 打印结果:百度一下,你就知道 ``` + + ### DrissionPage转selenium ```python @@ -418,6 +646,35 @@ print(driver.title) # 打印结果:百度一下,你就知道 +## 下载文件 + +selenium缺乏对浏览器下载文件的有效管理,难以进行检测下载状态、重命名、失败管理。 +使用requests下载文件能较好实现以上功能,但代码较为繁琐。 +因此DrissionPage封装了download方法,整合了两者优点,可从selenium获取登录信息,用requests进行下载。 +弥补了selenium的不足,使下载简洁高效。 + +### 功能 + +- 指定下载路径 +- 重命名文件,可不填写扩展名,程序自动补充 +- 存在同名文件时,可选择重命名、覆盖、跳过等处理方式 +- 显示下载进度 +- 支持post方式 +- 支持自定义连接参数 + +### 演示 + +```python +url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' # 文件url +save_path = r'C:\download' # 存放路径 + +# 重命名为img.png,存在重名时自动在文件名末尾加上序号,显示下载进度 +page.download(url, save_path, 'img', 'rename', show_msg=True) +``` + + + + ## Chrome快捷设置 chrome的配置很繁琐,为简化使用,本库提供了常用配置的设置方法。 @@ -442,6 +699,8 @@ set_proxy(proxy) # 设置代理地址 set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # 设置浏览器相关的路径 ``` + + ### 使用方法 ```python @@ -522,6 +781,8 @@ headers = { } ``` + + ### OptionsManager对象 OptionsManager对象用于读取、设置和保存配置。 @@ -534,6 +795,8 @@ save() # 保存配置到默认ini文件 save('D:\\settings.ini') # 保存到其它路径 ``` + + ### 使用示例 ```python @@ -1010,6 +1273,8 @@ MixPage封装了页面操作的常用功能,可在driver和session模式间无 - data: dict - 提交的数据 - go_anyway: bool - 是否强制跳转。若目标url和当前url一致,默认不跳转。 - show_errmsg: bool - 是否显示和抛出异常 +- retry: int - 连接出错时重试次数 +- interval: float - 重试间隔(秒) - **kwargs - 用于requests的连接参数 返回: [bool, None] - url是否可用 @@ -1073,7 +1338,7 @@ MixPage封装了页面操作的常用功能,可在driver和session模式间无 ### wait_ele() -等待元素从dom删除、显示、隐藏 +等待元素从dom删除、显示、隐藏。 参数说明: @@ -1081,6 +1346,8 @@ MixPage封装了页面操作的常用功能,可在driver和session模式间无 - mode: str - 等待方式,可选:'del', 'display', 'hidden' - timeout: float - 等待超时时间 +返回: bool - 等待是否成功 + ### check_page() @@ -1122,8 +1389,6 @@ d模式时检查网页是否符合预期。默认由response状态检查,可 ### close_current_tab() -close_current_tab() -> None - 关闭当前标签页。 返回: None @@ -1132,13 +1397,11 @@ close_current_tab() -> None ### close_other_tabs() -close_other_tabs(num_or_handle: Union[int, str, None] = None) -> None - 关闭传入的标签页以外标签页,默认保留当前页。 参数说明: -- num_or_handle - 要保留的标签页序号或handle,序号第一个为0,最后为-1 +- num_or_handle:[int, str] - 要保留的标签页序号或handle,序号第一个为0,最后为-1 返回: None @@ -1146,13 +1409,11 @@ close_other_tabs(num_or_handle: Union[int, str, None] = None) -> None ### to_tab() -to_tab(num_or_handle: Union[int, str] = 0) -> None - 跳转到标签页。 参数说明: -- num_or_handle - 标签页序号或handle字符串,序号第一个为0,最后为-1 +- num_or_handle:[int, str] - 标签页序号或handle字符串,序号第一个为0,最后为-1 返回: None @@ -1160,13 +1421,11 @@ to_tab(num_or_handle: Union[int, str] = 0) -> None ### to_iframe() -to_iframe(self, loc_or_ele: Union[int, str, tuple, WebElement, DriverElement] = 'main') -> None - 跳转到iframe,默认跳转到最高层级,兼容selenium原生参数。 参数说明: -- loc_or_ele - 查找iframe元素的条件,可接收iframe序号(0开始)、id或name、查询字符串、loc参数、WebElement对象、DriverElement对象,传入'main'跳到最高层,传入'parent'跳到上一层 +- loc_or_ele:[int, str, tuple, WebElement, DriverElement] - 查找iframe元素的条件,可接收iframe序号(0开始)、id或name、查询字符串、loc参数、WebElement对象、DriverElement对象,传入'main'跳到最高层,传入'parent'跳到上一层 ​ 示例: - to_iframe('tag:iframe') - 通过传入iframe的查询字符串定位 @@ -1183,13 +1442,11 @@ to_iframe(self, loc_or_ele: Union[int, str, tuple, WebElement, DriverElement] = ### scroll_to_see() -scroll_to_see(loc_or_ele: Union[str, tuple, WebElement, DriverElement]) -> None - 滚动直到元素可见。 参数说明: -- loc_or_ele - 查找iframe元素的条件,和ele()方法的查找条件一致。 +- loc_or_ele:[str, tuple, WebElement, DriverElement] - 查找元素的条件,和ele()方法的查找条件一致。 返回: None @@ -1197,14 +1454,12 @@ scroll_to_see(loc_or_ele: Union[str, tuple, WebElement, DriverElement]) -> None ### scroll_to() -scroll_to(mode: str = 'bottom', pixel: int = 300) -> None - 滚动页面,按照参数决定如何滚动。 参数说明: -- mode - 滚动的方向,top、bottom、rightmost、leftmost、up、down、left、right -- pixel - 滚动的像素 +- mode: str - 滚动的方向,top、bottom、rightmost、leftmost、up、down、left、right +- pixel: int - 滚动的像素 返回: None @@ -1212,8 +1467,6 @@ scroll_to(mode: str = 'bottom', pixel: int = 300) -> None ### refresh() -refresh() -> None - 刷新页面。 返回: None @@ -1222,8 +1475,6 @@ refresh() -> None ### back() -back() -> None - 页面后退。 返回: None @@ -1232,14 +1483,12 @@ back() -> None ### set_window_size() -set_window_size(x: int = None, y: int = None) -> None - 设置窗口大小,默认最大化。 参数说明: -- x - 目标宽度 -- y - 目标高度 +- x: int - 目标宽度 +- y: int - 目标高度 返回: None @@ -1247,14 +1496,12 @@ set_window_size(x: int = None, y: int = None) -> None ### screenshot() -screenshot(path: str, filename: str = None) -> str - 网页截图,返回截图文件路径。 参数说明: -- path - 截图保存路径,默认为ini文件中指定的临时文件夹 -- filename - 截图文件名,默认为页面title为文件名 +- path: str - 截图保存路径,默认为ini文件中指定的临时文件夹 +- filename: str - 截图文件名,默认为页面title为文件名 返回: str @@ -1262,46 +1509,40 @@ screenshot(path: str, filename: str = None) -> str ### chrome_downloading() -chrome_downloading(download_path: str = None) -> list - -查看浏览器下载情况。 +返回浏览器下载中的文件列表。 参数说明: -- download_path - 下载路径,默认为chrome options配置中的下载路径 +- download_path: str - 下载文件夹路径 -返回: +返回:list ### process_alert() -process_alert(mode: str = 'ok', text: str = None) -> Union[str, None] - 处理提示框。 参数说明: -- mode - 'ok' 或 'cancel',若输入其它值,不会按按钮但依然返回文本值 -- text - 处理prompt提示框时可输入文本 +- mode: str - 'ok' 或 'cancel',若输入其它值,不会按按钮但依然返回文本值 +- text: str - 处理prompt提示框时可输入文本 -返回: +返回: [str, None] - 提示框内容文本 ### close_driver() -close_driver() -> None +关闭driver及浏览器。 -关闭driver及浏览器,切换到s模式。 - -返回: +返回: None ### close_session() -关闭session,切换到d模式。 +关闭session。 返回: None @@ -1309,16 +1550,15 @@ close_driver() -> None ## DriverElement类 -class DriverElement(ele: WebElement, timeout: float = 10) +### class DriverElement() driver模式的元素对象,包装了一个WebElement对象,并封装了常用功能。 参数说明: -- ele - WebElement对象 -- timeout - 查找元素超时时间(每次查找元素时还可单独设置) - -返回: +- ele: WebElement - WebElement对象 +- page: DriverPage - 元素所在的页面对象 +- timeout: float - 查找元素超时时间(每次查找元素时还可单独设置) @@ -1326,31 +1566,7 @@ driver模式的元素对象,包装了一个WebElement对象,并封装了常 被包装的WebElement对象。 -返回: - - - -### driver - -操作元素的WebDriver对象。 - -返回: - - - -### attrs - -以字典方式返回元素所有属性及值。 - -返回: - - - -### text - -返回元素内的文本。 - -返回: +返回: WebElement @@ -1358,23 +1574,47 @@ driver模式的元素对象,包装了一个WebElement对象,并封装了常 返回元素内html文本。 -返回: +返回: str ### tag -返回元素标签名文本。 +返回元素标签名。 -返回: +返回: str + + + +### attrs + +以字典方式返回元素所有属性及值。 + +返回: dict + + + +### text + +返回元素内的文本。 + +返回: str + + + +### css_path + +返回元素css selector绝对路径。 + +返回: str ### xpath -返回元素xpath路径。 +返回元素xpath绝对路径。 -返回: +返回: str @@ -1382,7 +1622,7 @@ driver模式的元素对象,包装了一个WebElement对象,并封装了常 返回父级元素对象。 -返回: +返回: DriverElement @@ -1390,7 +1630,7 @@ driver模式的元素对象,包装了一个WebElement对象,并封装了常 返回下一个兄弟元素对象。 -返回: +返回: DriverElement @@ -1398,49 +1638,7 @@ driver模式的元素对象,包装了一个WebElement对象,并封装了常 返回上一个兄弟元素对象。 -返回: - - - -### parents() - -parents(num: int = 1) -> Union[DriverElement, None] - -返回第N层父级元素对象。 - -参数说明: - -- 第几层父元素 - -返回: - - - -### nexts() - -nexts(num: int = 1) -> Union[DriverElement, None] - -返回后面第N个兄弟元素对象。 - -参数说明: - -- 后面第几个兄弟元素 - -返回: - - - -### prevs() - -prevs(num: int = 1) -> Union[DriverElement, None] - -返回前面第N个兄弟元素对象。 - -参数说明: - -- 前面第几个兄弟元素 - -返回: +返回: DriverElement @@ -1448,7 +1646,7 @@ prevs(num: int = 1) -> Union[DriverElement, None] 以字典方式返回元素大小。 -返回: +返回: dict @@ -1456,24 +1654,107 @@ prevs(num: int = 1) -> Union[DriverElement, None] 以字典方式放回元素坐标。 -返回: +返回: dict + + + +### shadow_root + +返回当前元素的shadow_root元素对象 + +返回: ShadowRoot + + + +### before + +返回当前元素的::before伪元素内容 + +返回: str + + + +### after + +返回当前元素的::after伪元素内容 + +返回: str + + + +### texts() + +返回元素内所有直接子节点的文本,包括元素和文本节点 + +参数说明: + +- text_node_only:bool - 是否只返回文本节点 + +返回: List[str] + + + +### parents() + +返回第N层父级元素对象。 + +参数说明: + +- num: int - 第几层父元素 + +返回: DriverElement + + + +### nexts() + +返回后面第num个兄弟元素或节点文本。 + +参数说明: + +- num: int - 后面第几个兄弟元素或节点 +- mode: str - 'ele', 'node' 或 'text',匹配元素、节点、或文本节点 + +返回: [DriverElement, str] + + + +### prevs() + +返回前面第num个兄弟元素或节点文本。 + +参数说明: + +- num: int - 前面第几个兄弟元素或节点 +- mode: str - 'ele', 'node' 或 'text',匹配元素、节点、或文本节点 + +返回: [DriverElement, str] + + + +### attr() + +获取元素某个属性的值。 + +参数说明: + +- attr: str - 属性名称 + +返回: str ### ele() -ele(loc_or_str: Union[tuple, str], mode: str = None, show_errmsg: bool = False, timeout: float = None) -> Union[DriverElement, List[DriverElement], None] - -根据查询参数获取元素。 -​如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。 -​如是loc,直接按照内容查询。 +返回当前元素下级符合条件的子元素、属性或节点文本。 +如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。 +如是loc,直接按照内容查询。 参数说明: -- loc_or_str - 查询条件参数 -- mode - 查找一个或多个,传入'single'或'all' -- show_errmsg - 出现异常时是否抛出及显示 -- timeout - 查找元素超时时间 +- loc_or_str: [Tuple[str, str], str] - 元素的定位信息,可以是loc元组,或查询字符串 +- mode: str - 'single' 或 'all',对应查找一个或全部 +- timeout: float - 查找元素超时时间 示例: @@ -1501,374 +1782,354 @@ ele(loc_or_str: Union[tuple, str], mode: str = None, show_errmsg: bool = False, - ele.ele('xpath://div[@class="ele_class"]') - 返回第一个符合xpath的元素 - ele.ele('css:div.ele_class') - 返回第一个符合css selector的元素 -返回: +返回: [DriverElement, str] ### eles() -eles(loc_or_str: Union[tuple, str], show_errmsg: bool = False, timeout: float = None) -> List[DriverElement] - 根据查询参数获取符合条件的元素列表。查询参数使用方法和ele方法一致。 参数说明: -- loc_or_str - 查询条件参数 -- show_errmsg - 出现异常时是否抛出及显示 -- timeout - 查找元素超时时间 +- loc_or_str: [Tuple[str, str], str] - 查询条件参数 +- timeout: float - 查找元素超时时间 -返回: +返回: List[DriverElement or str] -### attr() +### get_style_property() -attr(attr: str) -> str - -获取元素某个属性的值。 +返回元素样式属性值。 参数说明: -- attr - 属性名称 +- style: str - 样式属性名称 +- pseudo_ele: str - 伪元素名称 -返回: +返回: str ### click() -click(by_js=None) -> bool - 点击元素,如不成功则用js方式点击,可指定是否用js方式点击。 参数说明: -- by_js - 是否用js方式点击 +- by_js: bool - 是否用js方式点击 -返回: +返回: bool ### input() -input(value, clear: bool = True) -> bool - -输入文本。 +输入文本,返回是否成功。 参数说明: -- value - 文本值 -- clear - 输入前是否清除文本框 +- value: str - 文本值 +- clear: bool - 输入前是否清除文本框 -返回: +返回: bool ### run_script() -run_script(script: str, *args) -> Any - 执行js代码,传入自己为第一个参数。 参数说明: -- script - JavaScript文本 -- args - 传入的参数 +- script: str - JavaScript文本 +- *args - 传入的参数 -返回: +返回: Any ### submit() -submit() -> None - 提交表单。 -返回: +返回: None ### clear() -clear() -> None - 清空文本框。 -返回: +返回: None ### is_selected() -is_selected() -> bool - 元素是否被选中。 -返回: +返回: bool ### is_enabled() -is_enabled() -> bool - 元素在页面中是否可用。 -返回: +返回: bool ### is_displayed() -is_displayed() -> bool - 元素是否可见。 -返回: +返回: bool ### is_valid() -is_valid() -> bool +元素是否还在DOM内。该方法用于判断页面跳转元素不能用的情况 -元素是否有效。该方法用于判断页面跳转元素不能用的情况 - -返回: +返回: bool ### screenshot() -screenshot(path: str, filename: str = None) -> str - 网页截图,返回截图文件路径。 参数说明: -- path - 截图保存路径,默认为ini文件中指定的临时文件夹 -- filename - 截图文件名,默认为页面title为文件名 +- path: str - 截图保存路径,默认为ini文件中指定的临时文件夹 +- filename: str - 截图文件名,默认为页面title为文件名 -返回: +返回: str ### select() -select(text: str) -> bool - 在下拉列表中选择。 参数说明: -- text - 选项文本 +- text: str - 选项文本 -返回: +返回: bool - 是否成功 ### set_attr() -set_attr(attr: str, value: str) -> bool - 设置元素属性。 参数说明: -- attr - 参数名 -- value - 参数值 +- attr: str - 参数名 +- value: str - 参数值 -返回: +返回: bool -是否成功 ### drag() -drag(x: int, y: int, speed: int = 40, shake: bool = True) -> bool - 拖拽当前元素一段距离,返回是否拖拽成功。 参数说明: -- x - 拖拽x方向距离 -- y - 拖拽y方向距离 -- speed - 拖拽速度 -- shake - 是否随机抖动 +- x: int - 拖拽x方向距离 +- y: int - 拖拽y方向距离 +- speed: int - 拖拽速度 +- shake: bool - 是否随机抖动 -返回: +返回: bool ### drag_to() -drag_to(ele_or_loc: Union[tuple, WebElement, DrissionElement], speed: int = 40, shake: bool = True) -> bool: - 拖拽当前元素,目标为另一个元素或坐标元组,返回是否拖拽成功。 参数说明: -- ele_or_loc - 另一个元素或相对当前位置,坐标为元素中点坐标。 -- speed - 拖拽速度 -- shake - 是否随机抖动 +- ele_or_loc[tuple, WebElement, DrissionElement] - 另一个元素或相对当前位置,坐标为元素中点坐标。 +- speed: int - 拖拽速度 +- shake: bool - 是否随机抖动 -返回: +返回: bool ### hover() -在元素上悬停鼠标 +在元素上悬停鼠标。 -返回: +返回: None ## SessionElement类 -class SessionElement(ele: Element) +### class SessionElement() session模式的元素对象,包装了一个Element对象,并封装了常用功能。 参数说明: -- ele - requests_html库的Element对象 - -返回: +- ele: _Element - lxml库的Element对象 +- page: SessionPage - 元素所在页面对象 ### inner_ele -​ 被包装的Element对象。 +被包装的_Element对象。 -返回: +返回: _Element ### attrs -​ 以字典格式返回元素所有属性的名称和值。 +以字典格式返回元素所有属性的名称和值。 -返回: +返回: dict ### text -​ 返回元素内的文本。 +返回元素内的文本,即innerText。 -返回: +返回: str ### html -​ 返回元素内html文本。 +返回元素内html文本,即innerHTML。 -返回: +返回: str ### tag -​ 返回元素标签名文本。 +返回元素标签名。 -返回: +返回: srt + + + +### css_path + +返回元素css selector绝对路径。 + +返回: srt ### xpath -​ 返回元素xpath路径。 +返回元素xpath绝对路径。 -返回: +返回: srt ### parent -​ 返回父级元素对象。 +返回父级元素对象。 -返回: +返回: SessionElement ### next -​ 返回下一个兄弟元素对象。 +返回下一个兄弟元素对象。 -返回: +返回: SessionElement ### prev -​ 返回上一个兄弟元素对象。 +返回上一个兄弟元素对象。 -返回: +返回: SessionElement ### parents() -​ parents(num: int = 1) -> Union[SessionElement, None] +返回第N层父级元素对象。 -​ 返回第N层父级元素对象。 +参数说明: -​ 参数说明: +- num:int - 第几层父元素 -- num - 第几层父元素 - -返回: +返回: SessionElement ### nexts() -​ nexts(num: int = 1) -> Union[SessionElement, None] +返回后面第num个兄弟元素或节点文本。 -​ 返回后N个兄弟元素对象。 +参数说明: -​ 参数说明: +- num - 后面第几个兄弟元素 +- mode: str - 'ele', 'node' 或 'text',匹配元素、节点、或文本节点 -- num - 后面第几个兄弟元素 - -返回: +返回: [SessionElement, str] ### prevs() -​ prevs(num: int = 1) -> Union[SessionElement, None] +返回前N个兄弟元素对象。 -​ 返回前N个兄弟元素对象。 +参数说明: -​ 参数说明: +- num - 前面第几个兄弟元素 +- mode: str - 'ele', 'node' 或 'text',匹配元素、节点、或文本节点 -- num - 前面第几个兄弟元素 +返回: [SessionElement, str] -返回: + + +### attr() + +获取元素某个属性的值。 + +参数说明: + +- attr: str - 属性名称 + +返回: str ### ele() -​ ele(loc_or_str: Union[tuple, str], mode: str = None, show_errmsg: bool = False) -> Union[SessionElement, List[SessionElement], None] +根据查询参数获取元素。 +如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。 +如是loc,直接按照内容查询。 -​ 根据查询参数获取元素。 -​ 如查询参数是字符串,可选'@属性名:'、'tag:'、'text:'、'css:'、'xpath:'方式。无控制方式时默认用text方式查找。 -​ 如是loc,直接按照内容查询。 +参数说明: -​ 参数说明: +- loc_or_str:[Tuple[str, str], str] - 查询条件参数 -- loc_or_str - 查询条件参数 +- mode:str - 查找一个或多个,传入'single'或'all' -- mode - 查找一个或多个,传入'single'或'all' -- show_errmsg - 出现异常时是否抛出及显示 - -​ 示例: +示例: - 用loc元组查找: @@ -1894,123 +2155,96 @@ session模式的元素对象,包装了一个Element对象,并封装了常用 - ele.ele('xpath://div[@class="ele_class"]') - 返回第一个符合xpath的元素 - ele.ele('css:div.ele_class') - 返回第一个符合css selector的元素 -返回: +返回: [SessionElement, str] ### eles() -eles(loc_or_str: Union[tuple, str], show_errmsg: bool = False) -> List[SessionElement] - 根据查询参数获取符合条件的元素列表。查询参数使用方法和ele方法一致。 参数说明: -- loc_or_str - 查询条件参数 -- show_errmsg - 出现异常时是否抛出及显示 +- loc_or_str: [Tuple[str, str], str] - 查询条件参数 -返回: +返回: List[SessionElement or str] -### attr() - -attr(attr: str) -> str - -获取元素某个属性的值。 - -参数说明: - -- attr - 属性名称 - -返回: - ## OptionsManager类 -class OptionsManager(path: str = None) +### class OptionsManager() 管理配置文件内容的类。 参数说明: -- path - ini文件路径,不传入则默认读取当前文件夹下的configs.ini文件 - -返回: +- path:str - ini文件路径,不传入则默认读取当前文件夹下的configs.ini文件 ### get_value() -get_value(section: str, item: str) -> Any - 获取配置的值。 参数说明: -- section - 段落名称 -- item - 配置项名称 +- section: str - 段落名称 +- item: str - 配置项名称 -返回: +返回: Any ### get_option() -get_option(section: str) -> dict - 以字典的格式返回整个段落的配置信息。 参数说明: -- section - 段落名称 +- section: str - 段落名称 -返回: +返回: dict ### set_item() -set_item(section: str, item: str, value: str) -> OptionsManager - -设置配置值。 +设置配置值,返回自己,用于链式操作。 参数说明: -- section - 段落名称 -- item - 配置项名称 -- value - 值内容 +- section: str - 段落名称 +- item: str - 配置项名称 +- value: Any - 值内容 -返回: +返回: OptionsManager - 返回自己 ### save() -save(path: str = None) -> OptionsManager - -保存设置到文件。 +保存设置到文件,返回自己,用于链式操作。 参数说明: -- path - ini文件的路径,默认保存到模块文件夹下的 +- path:str - ini文件的路径,默认保存到模块文件夹下的 -返回: +返回: OptionsManager - 返回自己 ## DriverOptions类 -class DriverOptions(read_file=True) +### class DriverOptions() chrome浏览器配置类,继承自selenium.webdriver.chrome.options的Options类,增加了删除配置和保存到文件方法。 参数说明: -- read_file - 布尔型,指定创建时是否从ini文件读取配置信息 - -返回: +- read_file:bool - 创建时是否从ini文件读取配置信息 @@ -2018,7 +2252,7 @@ chrome浏览器配置类,继承自selenium.webdriver.chrome.options的Options chromedriver.exe的路径。 -返回: +返回: str @@ -2026,177 +2260,153 @@ chromedriver.exe的路径。 chrome.exe的路径 -返回: +返回: str + + + +### save() + +保存设置到文件,返回自己,用于链式操作。 + +参数说明: + +- path:str - ini文件的路径,默认保存到模块文件夹下的 + +返回: DriverOptions - 返回自己 ### remove_argument() -remove_argument(value: str) -> DriverOptions - 移除一个设置。 参数说明: -- value - 要移除的属性值 +- value:str - 要移除的属性值 -返回: +返回: DriverOptions - 返回自己 ### remove_experimental_option() -remove_experimental_option(key: str) -> DriverOptions - 移除一个实验设置,传入key值删除。 参数说明: - key - 要移除的实验设置key值 -返回: +返回: DriverOptions - 返回自己 -### remove_argument() - -remove_argument() -> DriverOptions +### remove_all_extensions() 移除所有插件,因插件是以整个文件储存,难以移除其中一个,故如须设置则全部移除再重设。 -返回: - - - -### save() - -save(path: str = None) -> DriverOptions - -保存设置到文件。 - -参数说明: - -- path - ini文件的路径,默认保存到模块文件夹下的 - -返回: +返回: DriverOptions - 返回自己 ### set_argument() -set_argument(arg: str, value: Union[bool, str]) -> DriverOptions - 设置chrome属性,无值的属性可设置开关,有值的属性可设置属性的值。 参数说明: -- arg - 属性名 -- value - 属性值,有值的属性传入值,没有的传入bool +- arg:str - 属性名 +- value[bool, str] - 属性值,有值的属性传入值,没有的传入bool -返回: +返回: DriverOptions - 返回自己 ### set_headless() -set_headless(on_off: bool = True) -> DriverOptions - 打开或关闭无界面模式。 参数说明: -on_off - 打开或关闭,bool +on_off: bool - 打开或关闭 -返回: +返回: DriverOptions - 返回自己 ### set_no_imgs() -set_no_imgs(on_off: bool = True) -> DriverOptions - 是否加载图片。 参数说明: -on_off - 打开或关闭,bool +on_off: bool - 打开或关闭 -返回: +返回: DriverOptions - 返回自己 ### set_no_js() -set_no_js(on_off: bool = True) -> DriverOptions - 是否禁用js。 参数说明: -on_off - 打开或关闭,bool +on_off: bool - 打开或关闭 -返回: +返回: DriverOptions - 返回自己 ### set_mute() -set_mute(on_off: bool = True) -> DriverOptions - 是否静音。 参数说明: -on_off - 打开或关闭,bool +on_off: bool - 打开或关闭 -返回: +返回: DriverOptions - 返回自己 ### set_user_agent() -set_user_agent(user_agent: str) -> DriverOptions - 设置浏览器user agent。 参数说明: -- user_agent - user agent字符串 +- user_agent:str - user agent字符串 -返回: +返回: DriverOptions - 返回自己 ### set_proxy() -set_proxy(proxy: str) -> DriverOptions - 设置代理。 参数说明: -- proxy - 代理地址 +- proxy:str - 代理地址 -返回: +返回: DriverOptions - 返回自己 ### set_paths() -set_paths(driver_path: str = None, chrome_path: str = None, debugger_address: str = None, download_path: str = None, user_data_path: str = None, cache_path: str = None) -> DriverOptions - 设置浏览器相关的路径。 -​ 参数说明: +参数说明: -- driver_path - chromedriver.exe的路径 -- chrome_path - chrome.exe的路径 -- debugger_address - 调试浏览器地址,例:127.0.0.1:9222 -- download_path - 下载文件路径 -- user_data_path - 用户数据路径 -- cache_path - 缓存路径 +- driver_path:str - chromedriver.exe的路径 +- chrome_path:str - chrome.exe的路径 +- debugger_address:str - 调试浏览器地址,例:127.0.0.1:9222 +- download_path:str - 下载文件路径 +- user_data_path:str - 用户数据路径 +- cache_path:str - 缓存路径 -返回: +返回: DriverOptions - 返回自己 @@ -2206,115 +2416,115 @@ chrome的配置太难记,所以把常用的配置写成简单的方法,调 ### set_paths() -set_paths(driver_path: str = None, chrome_path: str = None, debugger_address: str = None, global_tmp_path: str = None, download_path: str = None, user_data_path: str = None, cache_path: str = None, check_version: bool = True) -> None - 便捷的设置路径方法,把传入的路径保存到默认ini文件,并检查chrome和chromedriver版本是否匹配。 参数说明: -- driver_path     - chromedriver.exe路径 -- chrome_path    - chrome.exe路径 -- debugger_address - 调试浏览器地址,例:127.0.0.1:9222 -- download_path - 下载文件路径 -- global_tmp_path - 临时文件夹路径 -- user_data_path - 用户数据路径 -- cache_path - 缓存路径 -- check_version - 是否检查chromedriver和chrome是否匹配 +- driver_path:str - chromedriver.exe路径 +- chrome_path:str - chrome.exe路径 +- debugger_address:str - 调试浏览器地址,例:127.0.0.1:9222 +- download_path:str - 下载文件路径 +- global_tmp_path:str - 临时文件夹路径 +- user_data_path:str - 用户数据路径 +- cache_path:str - 缓存路径 +- check_version:bool - 是否检查chromedriver和chrome是否匹配 -返回: +返回: None ### set_argument() -set_argument(arg: str, value: Union[bool, str]) -> None - 设置属性。若属性无值(如'zh_CN.UTF-8'),value传入bool表示开关;否则value传入str,当value为''或False,删除该属性项。 参数说明: -- arg  - 属性名 -- value - 属性值,有值的属性传入值,没有的传入bool +- arg:str   - 属性名 +- value[bool, str] - 属性值,有值的属性传入值,没有的传入bool -返回: +返回: None ### set_headless() -set_headless(on_off: bool) -> None - 开启或关闭headless模式。 参数说明: -- on_off - 是否开启headless模式 - +- on_off: bool - 是否开启headless模式 +返回: None ### set_no_imgs() -set_no_imgs(on_off: bool) -> None - 开启或关闭图片显示。 参数说明: -- on_off - 是否开启无图模式 - +- on_off: bool - 是否开启无图模式 +返回: None ### set_no_js() -set_no_js(on_off: bool) -> None - 开启或关闭禁用JS模式。 参数说明: -- on_off - 是否开启禁用JS模式 +- on_off: bool - 是否开启禁用JS模式 -### +返回: None -**set_mute**(on_off: bool) -> None + + +### set_mute() 开启或关闭静音模式。 参数说明: -- on_off - 是否开启静音模式 +- on_off: bool - 是否开启静音模式 + +返回: None -**set_user_agent**(user_agent: str) -> None: +### set_user_agent() 设置user_agent。 参数说明: -- user_agent - user_agent值 +- user_agent: str - user_agent值 + +返回: None -**set_proxy**(proxy: str) -> None +### set_proxy() 设置代理。 参数说明: -- proxy - 代理值 +- proxy: str - 代理值 + +返回: None -**check_driver_version**(driver_path, chrome_path) -> bool +### check_driver_version() 检查chrome与chromedriver版本是否匹配。 参数说明: -- driver_path  - chromedriver.exe路径 -- chrome_path - chrome.exe路径 \ No newline at end of file +- driver_path: bool  - chromedriver.exe路径 +- chrome_path: bool - chrome.exe路径 + +返回: bool \ No newline at end of file