From 96340024c574c3b0fe2d2c9013103c27df4866cc Mon Sep 17 00:00:00 2001 From: g1879 Date: Fri, 20 Nov 2020 23:20:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 236 ++++++++++++++++-------- README.zh-cn.md | 481 ++++++++++++++++++++++++++---------------------- 2 files changed, 419 insertions(+), 298 deletions(-) diff --git a/README.en.md b/README.en.md index 23908c1..6e8f53a 100644 --- a/README.en.md +++ b/README.en.md @@ -80,11 +80,11 @@ The page element class in session mode can obtain element attribute values and s The following code implements exactly the same function, compare the amount of code between the two: -- Use explicit waiting to find all elements that contain some text +- Find the first element whose text contains some text with explicit wait ```python # Use selenium: -element = WebDriverWait(driver).until(ec.presence_of_all_elements_located((By.XPATH,'//*[contains(text(), "some text")]'))) +element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH,'//*[contains(text(), "some text")]'))) # Use DrissionPage: element = page('some text') @@ -179,11 +179,11 @@ shadow_element = element.shadow_root -- Use xpath to get attributes or nodes +- Use xpath to get attributes or text nodes directly ```python # Use selenium: -The usage is not supported +Quite complicated # Use DrissionPage: class_name = element('xpath://div[@id="div_id"]/@class') @@ -305,7 +305,8 @@ page.download(url, save_path) pip install DrissionPage ``` Only supports python3.6 and above, and the driver mode currently only supports chrome.It has only been tested in the Windows environment. -To use the driver mode, you must download chrome and **corresponding version** of chromedriver. [[chromedriver download]](https://chromedriver.chromium.org/downloads) +To use the driver mode, you must download chrome and **corresponding version** of chromedriver. [[chromedriver download]](https://chromedriver.chromium.org/downloads) +The get_match_driver() method in the easy_set tool can automatically identify the chrome version and download the matching driver. # Instructions @@ -314,7 +315,7 @@ To use the driver mode, you must download chrome and **corresponding version** o ## Import module ```python -from DrissionPage import * +from DrissionPage import MixPage ``` @@ -325,31 +326,74 @@ If you only use session mode, you can skip this section. Before using selenium, you must configure the path of chrome.exe and chromedriver.exe and ensure that their versions match. -There are three ways to configure the path: -- Write two paths to system variables. -- Manually pass in the path when in use. -- Write the path to the ini file of this library (recommended). +There are four ways to configure the path: +-Use the get_match_driver() method of the easy_set tool (recommended) +-Write the path to the ini file of this library +-Write two paths to system variables +-Manually pass in the path when using -If you choose the third method, please run these lines of code before using this library for the first time and record these two paths in the ini file. +### Use get_match_driver() method + +If you choose the first method, please run the following code before using it for the first time. The program will automatically detect the Chrome version installed on your computer, download the corresponding driver, and record it in the ini file. + +```python +from DrissionPage.easy_set import get_match_driver +get_match_driver() +``` + +Output: + +``` +ini文件中chrome.exe路径 D:\Google Chrome\Chrome\chrome.exe + +version 75.0.3770.100 + +chromedriver_win32.zip +Downloading to: D:\python\projects\DrissionPage\DrissionPage + 100% Success. + +解压路径 D:\python\projects\chromedriver.exe + +正在检测可用性... +版本匹配,可正常使用。 +``` + +Then you can start using it. + +If you want to specify the save path of the ini file and chromedriver.exe, you can write: + +```python +get_match_driver(ini_path ='ini file path', save_path ='save path') +``` + + + +### Use set_paths() method + +If the previous method fails, you can download chromedriver.exe yourself, and then run the following code to record the path to the ini file. ```python from DrissionPage.easy_set import set_paths -driver_path ='D:\\chrome\\chromedriver.exe' # Your chromedriver.exe path, optional -chrome_path ='D:\\chrome\\chrome.exe' # Your chrome.exe path, optional +driver_path ='D:\\chrome\\chromedriver.exe' # Your chromedriver.exe path, if not filled in, it will be searched in system variables +chrome_path ='D:\\chrome\\chrome.exe' # Your chrome.exe path, if not filled in, it will be searched in system variables set_paths(driver_path, chrome_path) ``` This method also checks whether the chrome and chromedriver versions match, and displays: ``` -The version matches and can be used normally. +正在检测可用性... +版本匹配,可正常使用。 +``` -# Or +or -Abnormal: +``` +出现异常: Message: session not created: Chrome version must be between 70 and 73 (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.19631 x86_64) -chromedriver download URL: https://chromedriver.chromium.org/downloads +可执行easy_set.get_match_driver()自动下载匹配的版本。 +或自行从以下网址下载:https://chromedriver.chromium.org/downloads ``` After passing the check, you can use the driver mode normally. @@ -390,10 +434,9 @@ drission = Drission(ini_path ='D:\\settings.ini') drission = Drission(read_file = False) ``` -To manually pass in the configuration: +To manually pass in the configuration (ignore the ini file): ```python -# Create with the incoming configuration information (ignore the ini file) from DrissionPage.config import DriverOptions # Create a driver configuration object, read_file = False means not to read the ini file @@ -417,7 +460,7 @@ drission = Drission(driver_options, session_options) The MixPage page object encapsulates common web page operations and realizes the switch between driver and session modes. MixPage must receive a Drission object and use the driver or session in it. If it is not passed in, MixPage will create a Drission by itself (using the configuration of the default ini file). -Tips: When multiple page objects work together, remember to manually create a Drission object and pass it to the page object for use. Otherwise, the page objects will each create their own Drission objects, making the information unable to pass. +Tips: When multiple objects work together, you can pass the Drission object in one MixPage to another, so that multiple objects can share login information or operate the same page. ### Create Object @@ -432,7 +475,7 @@ page = MixPage('s') page = MixPage(drission) page = MixPage(drission, mode='s', timeout=5) # session mode, waiting time is 5 seconds (default 10 seconds) -# Create with incoming configuration information +# Incoming configuration information, MixPage internally creates Drission according to the configuration page = MixPage(driver_options=DriverOption, session_options=SessionOption) # default d mode ``` @@ -653,7 +696,7 @@ element.hover() # Hover the mouse over the element ## Docking with selenium code -The DrissionPage code can be seamlessly spliced ​​with the selenium code, either directly using the selenium WebDriver object, or using its own WebDriver everywhere for the selenium code. Make the migration of existing projects very convenient. +The DrissionPage code can be seamlessly spliced with the selenium code, either directly using the selenium WebDriver object, or using its own WebDriver everywhere for the selenium code. Make the migration of existing projects very convenient. ### selenium to DrissionPage @@ -717,19 +760,20 @@ The configuration of chrome is very cumbersome. In order to simplify the use, th The DriverOptions object inherits from the Options object of selenium.webdriver.chrome.options, and the following methods are added to it: ```python -remove_argument(value) # delete an argument value -remove_experimental_option(key) # delete an experimental_option setting -remove_all_extensions() # Remove all plugins -save() # Save the configuration to the default ini file -save('D:\\settings.ini') # save to other path -set_argument(arg, value) # set argument attribute -set_headless(on_off) # Set whether to use no interface mode -set_no_imgs(on_off) # Set whether to load images -set_no_js(on_off) # Set whether to disable js -set_mute(on_off) # Set whether to mute -set_user_agent(user_agent) # set user agent -set_proxy(proxy) # set proxy address -set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # Set browser- related paths +options.remove_argument(value) # Remove an argument value +options.remove_experimental_option(key) # delete an experimental_option setting +options.remove_all_extensions() # Remove all plugins +options.save() # Save the currently opened ini file +options.save('D:\\settings.ini') # Save to the specified path ini file +options.save('default') # Save the current settings to the default ini file +options.set_argument(arg, value) # set argument property +options.set_headless(on_off) # Set whether to use interfaceless mode +options.set_no_imgs(on_off) # Set whether to load images +options.set_no_js(on_off) # Set whether to disable js +options.set_mute(on_off) # Set whether to mute +options.set_user_agent(user_agent) # set user agent +options.set_proxy(proxy) # Set proxy address +options.set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # Set browser-related paths ``` @@ -737,16 +781,17 @@ set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_p ### Instructions ```python -do = DriverOptions(read_file=False) # Create chrome configuration object, not read from ini file -do.set_headless(False) # show the browser interface -do.set_no_imgs(True) # Do not load pictures -do.set_paths(driver_path='D:\\chromedriver.exe', chrome_path='D:\\chrome.exe') # set path -do.set_headless(False).set_no_imgs(True) # Support chain operation +do = DriverOptions(read_file=False) # Create chrome configuration object, do not read from ini file +do.set_headless(False) # show the browser interface +do.set_no_imgs(True) # Do not load pictures +do.set_paths(driver_path='D:\\chromedriver.exe', chrome_path='D:\\chrome.exe') # set path +do.set_headless(False).set_no_imgs(True) # Support chain operation -drission = Drission(driver_options=do) # Create Drission object with configuration object -page = MixPage(drission) # Create a MixPage object with Drission object +drission = Drission(driver_options=do) # Create Drission object with configuration object +page = MixPage(drission) # Create MixPage object with Drission object -do.save() # Save the configuration to the default ini file +do.save() # Save the currently opened ini file +do.save('default') # Save the current settings to the default ini file ``` @@ -821,11 +866,15 @@ headers = { The OptionsManager object is used to read, set and save the configuration. ```python -get_value(section, item) - > str # Get the value of a configuration -get_option(section) - > dict # Return all attributes of configuration in dictionary format -set_item(section, item, value) # Set configuration attributes -save() # Save the configuration to the default ini file -save('D:\\settings.ini') # save to other path +manager.paths # Return path settings in dictionary form +manager.chrome_options # Return chrome settings in dictionary form +manager.session_options # Return session settings in dictionary form +manager.get_value(section, item) # Get the value of a configuration +manager.get_option(section) # Return all attributes of configuration in dictionary format +manager.set_item(section, item, value) # Set configuration properties +manager.manager.save() # Save the currently opened ini file +manager.save('D:\\settings.ini') # Save to the specified path ini file +manager.save('default') # Save the current settings to the default ini file ``` @@ -835,22 +884,20 @@ save('D:\\settings.ini') # save to other path ```python from DrissionPage.configs import * -options_manager = OptionsManager() # Create OptionsManager object from the default ini file -options_manager = OptionsManager('D:\\settings.ini') # Create OptionsManager object from other ini files -driver_path = options_manager.get_value('paths','chromedriver_path') # read path information -options_manager.save() # Save to the default ini file -options_manager.save('D:\\settings.ini') # save to other path +options_manager = OptionsManager() # Create OptionsManager object from the default ini file +options_manager = OptionsManager('D:\\settings.ini') # Create OptionsManager object from other ini files +driver_path = options_manager.get_value('paths','chromedriver_path') # read path information +options_manager.save() # Save the currently opened ini file +options_manager.save('D:\\settings.ini') # Save to the specified path ini file -drission = Drission(ini_path ='D:\\settings.ini') # Use other ini files to create objects +drission = Drission(ini_path='D:\\settings.ini') # Use the specified ini file to create the object ``` -**Note**: If you do not pass in the path when saving, it will be saved to the ini file in the module directory, even if the read is not the default ini file. - ## easy_set method -Calling the easy_set method will modify the content of the default ini file. +The methods of frequently used settings can be quickly modified. Calling the easy_set method will modify the content of the default ini file. ```python set_headless(True) # Turn on headless mode @@ -2363,7 +2410,7 @@ Save the settings to a file and return to yourself for chain operation. Parameter Description: -- path: str - the path of the ini file, saved to the module folder by default +- path: str - the path of the ini file, pass in 'default' would save to the default ini file Return: OptionsManager - return to yourself @@ -2378,6 +2425,7 @@ The Chrome browser configuration class, inherited from the Options class of sele Parameter Description: - read_file: bool - Whether to read configuration information from the ini file when creating +- ini_path: str - ini file path, if it is None, the default ini file will be read @@ -2403,7 +2451,7 @@ Save the settings to a file and return to yourself for chain operation. Parameter Description: -- path: str - the path of the ini file, saved to the module folder by default +- path: str - the path of the ini file, pass in 'default' would save to the default ini file Return: DriverOptions - return self @@ -2551,6 +2599,12 @@ Chrome configuration is too complicated, so the commonly used configuration is w Automatically identify the chrome version and download the matching driver. Get the chrome.exe path recorded in the ini file, if not, get the path in the system variable. +Parameter Description: + +- ini_path: str-the path of the ini file to be read and modified + +- save_path: str-chromedriver save path + Returns: None @@ -2559,24 +2613,37 @@ Returns: None Print all configuration information in the ini file. +Parameter Description: + +- ini_path: str-ini file path, if it is None, read the default ini file + Returns: None ### set_paths() -Convenient way to set the path, save the incoming path to the default ini file, and check whether the chrome and chromedriver versions match. +Convenient way to set the path, save the passed path to an ini file, and check whether the chrome and chromedriver versions match. Parameter Description: -- driver_path: str - chromedriver.exe path -- chrome_path: str - chrome.exe path -- debugger_address: str - debug browser address, for example: 127.0.0.1:9222 -- download_path: str - download file path -- global_tmp_path: str - Temporary folder path -- user_data_path: str - user data path -- cache_path: str - cache path -- check_version: bool - whether to check if chromedriver and chrome match +- driver_path: str-chromedriver.exe path + +- chrome_path: str-chrome.exe path + +- debugger_address: str-debug browser address, for example: 127.0.0.1:9222 + +- download_path: str-download file path + +- global_tmp_path: str-Temporary folder path + +- user_data_path: str-user data path + +- cache_path: str-cache path + +- ini_path: str-ini file path, if it is None, save to the default ini file + +- check_version: bool-whether to check if chromedriver and chrome match Returns: None @@ -2584,12 +2651,15 @@ Returns: None ### set_argument() -Set the properties. If the attribute has no value (such as'zh_CN.UTF- 8'), value is passed in bool to indicate switch; otherwise, value is passed in str, and when value is'' or False, delete the attribute item. +Set the properties. If the attribute has no value (such as'zh_CN.UTF-8' ), value is passed in bool to indicate a switch; otherwise, value is assigned to the attribute. When value is'' or False, delete the attribute item. Parameter Description: -- arg:str - Property name -- value[bool, str] - Attribute value, the attribute with value is passed in the value, and the attribute without value is passed in bool +- arg: str-attribute name + +- value: [bool, str]-attribute value, the value attribute is passed in the value, and the non-property is passed in bool + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2601,7 +2671,9 @@ Turn headless mode on or off. Parameter Description: -- on_off: bool - whether to turn on headless mode +- on_off: bool-whether to turn on headless mode + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2613,7 +2685,9 @@ Turn picture display on or off. Parameter Description: -- on_off: bool - Whether to turn on the no image mode +- on_off: bool-whether to turn on the no image mode + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2625,7 +2699,9 @@ Turn on or off disable JS mode. Parameter Description: -- on_off: bool - Whether to enable the disable JS mode +- on_off: bool-whether to enable or disable JS mode + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2637,7 +2713,9 @@ Turn on or off the silent mode. Parameter Description: -- on_off: bool - Whether to turn on silent mode +- on_off: bool-whether to turn on silent mode + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2649,7 +2727,9 @@ Set user_agent. Parameter Description: -- user_agent: str - user_agent value +- user_agent: str-user_agent value + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None @@ -2661,7 +2741,9 @@ Set up a proxy. Parameter Description: -- proxy: str - proxy value +- proxy: str-proxy value + +- ini_path: str-ini file path, if it is None, save to the default ini file Returns: None diff --git a/README.zh-cn.md b/README.zh-cn.md index b33de53..bcb8697 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -2,7 +2,8 @@ *** -DrissionPage,即 driver 和 session 的合体,是个基于 python 的 Web 自动化操作集成工具。 +DrissionPage,即 driver 和 session 的合体。 +是个基于 python 的 Web 自动化操作集成工具。 它实现了 selenium 和 requests 之间的无缝切换。 因此可以兼顾 selenium 的便利性和 requests 的高效率。 它集成了页面常用功能,两种模式系统一致的 API,使用便捷。 @@ -30,7 +31,7 @@ DrissionPage,即 driver 和 session 的合体,是个基于 python 的 Web ## 背景 -requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。 +requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。 使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。 除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。 一切从简,尽量提供简单直接的使用方法,对新手更友好。 @@ -56,19 +57,19 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码, ![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/20201118170751.jpg) -## Drission类 +## Drission 类 管理负责与网页通讯的 WebDriver 对象和 Session 对象,相当于驱动器的角色。 -## MixPage类 +## MixPage 类 MixPage 封装了页面操作的常用功能,它调用 Drission 类中管理的驱动器,对页面进行访问、操作。可在 driver 和 session 模式间切换。切换的时候会自动同步登录状态。 -## DriverElement类 +## DriverElement 类 driver 模式下的页面元素类,可对元素进行点击、输入文本、修改属性、运行 js 等操作,也可在其下级搜索后代元素。 -## SessionElement类 +## SessionElement 类 session 模式下的页面元素类,可获取元素属性值,也可在其下级搜索后代元素。 @@ -76,17 +77,17 @@ session 模式下的页面元素类,可获取元素属性值,也可在其下 *** -## 与selenium代码对比 +## 与 selenium 代码对比 以下代码实现一模一样的功能,对比两者的代码量: -- 用显性等待方式查找所有文本包含 some text 的元素 +- 用显性等待方式查找第一个文本包含 some text 的元素 ```python -# 使用selenium: -element = WebDriverWait(driver).until(ec.presence_of_all_elements_located((By.XPATH, '//*[contains(text(), "some text")]'))) +# 使用 selenium: +element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]'))) -# 使用DrissionPage: +# 使用 DrissionPage: element = page('some text') ``` @@ -95,10 +96,10 @@ element = page('some text') - 跳转到第一个标签页 ```python -# 使用selenium: +# 使用 selenium: driver.switch_to.window(driver.window_handles[0]) -# 使用DrissionPage: +# 使用 DrissionPage: page.to_tab(0) ``` @@ -107,12 +108,12 @@ page.to_tab(0) - 按文本选择下拉列表 ```python -# 使用selenium: +# 使用 selenium: from selenium.webdriver.support.select import Select select_element = Select(element) select_element.select_by_visible_text('text') -# 使用DrissionPage: +# 使用 DrissionPage: element.select('text') ``` @@ -121,10 +122,10 @@ element.select('text') - 拖拽一个元素 ```python -# 使用selenium: +# 使用 selenium: ActionChains(driver).drag_and_drop(ele1, ele2).perform() -# 使用DrissionPage: +# 使用 DrissionPage: ele1.drag_to(ele2) ``` @@ -133,10 +134,10 @@ ele1.drag_to(ele2) - 滚动窗口到底部(保持水平滚动条不变) ```python -# 使用selenium: +# 使用 selenium: driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);") -# 使用DrissionPage: +# 使用 DrissionPage: page.scroll_to('bottom') ``` @@ -145,11 +146,11 @@ page.scroll_to('bottom') - 设置 headless 模式 ```python -# 使用selenium: +# 使用 selenium: options = webdriver.ChromeOptions() options.add_argument("--headless") -# 使用DrissionPage: +# 使用 DrissionPage: set_headless() ``` @@ -158,10 +159,10 @@ set_headless() - 获取伪元素内容 ```python -# 使用selenium: +# 使用 selenium: text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");', element) -# 使用DrissionPage: +# 使用 DrissionPage: text = element.after ``` @@ -170,29 +171,29 @@ text = element.after - 获取 shadow-root ```python -# 使用selenium: +# 使用 selenium: shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element) -# 使用DrissionPage: +# 使用 DrissionPage: shadow_element = element.shadow_root ``` -- 用 xpath 获取属性或节点 +- 用 xpath 直接获取属性或文本节点(返回文本) ```python -# 使用selenium: -不支持该用法 +# 使用 selenium: +相当复杂 -# 使用DrissionPage: +# 使用 DrissionPage: class_name = element('xpath://div[@id="div_id"]/@class') text = element('xpath://div[@id="div_id"]/text()[2]') ``` -## 与requests代码对比 +## 与 requests 代码对比 以下代码实现一模一样的功能,对比两者的代码量: @@ -201,7 +202,7 @@ text = element('xpath://div[@id="div_id"]/text()[2]') ```python url = 'https://baike.baidu.com/item/python' -# 使用requests: +# 使用 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) @@ -209,7 +210,7 @@ html = etree.HTML(response.text) element = html.xpath('//h1')[0] title = element.text -# 使用DrissionPage: +# 使用 DrissionPage: page = MixPage('s') page.get(url) title = page('tag:h1').text @@ -225,13 +226,13 @@ Tips: DrissionPage 自带默认 headers url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' save_path = r'C:\download' -# 使用requests: +# 使用 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: +# 使用 DrissionPage: page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突 ``` @@ -239,17 +240,18 @@ page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突 ## 模式切换 -用 selenium 登录网站,然后切换到requests读取网页。两者会共享登录信息。 +用 selenium 登录网站,然后切换到 requests 读取网页。两者会共享登录信息。 ```python -page = MixPage() # 创建页面对象,默认driver模式 +page = MixPage() # 创建页面对象,默认 driver 模式 page.get('https://gitee.com/profile') # 访问个人中心页面(未登录,重定向到登录页面) -page.ele('@id:user_login').input('your_user_name') # 使用selenium输入账号密码登录 +page.ele('@id:user_login').input('your_user_name') # 使用 selenium 输入账号密码登录 page.ele('@id:user_password').input('your_password\n') +sleep(1) -page.change_mode() # 切换到session模式 -print('登录后title:', page.title, '\n') # 登录后session模式的输出 +page.change_mode() # 切换到 session 模式 +print('登录后title:', page.title, '\n') # 登录后 session 模式的输出 ``` 输出: @@ -264,8 +266,8 @@ print('登录后title:', page.title, '\n') # 登录后session模式的输出 ```python # 接上段代码 -foot = page.ele('@id:footer-left') # 用id查找元素 -first_col = foot.ele('css:>div') # 使用css selector在元素的下级中查找元素(第一个) +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') # 获取元素属性值 @@ -315,7 +317,7 @@ easy_set 工具中的 get_match_driver() 方法可自动识别 chrome 版本并 ## 导入模块 ```python -from DrissionPage import * +from DrissionPage import MixPage ``` @@ -332,6 +334,8 @@ from DrissionPage import * - 将两个路径写入系统变量 - 使用时手动传入路径 +### 使用 get_match_driver() 方法 + 若你选择第一种方式,请在第一次使用前,运行以下代码,程序会自动检测电脑安装的 chrome 版本,下载对应 driver,并记录到 ini 文件。 ```python @@ -358,29 +362,43 @@ Downloading to: D:\python\projects\DrissionPage\DrissionPage 然后就可以开始使用了。 -若上一种方法失败,可自行下载 chromedriver.exe,然后运行以下代码,把这两个路径记录到 ini 文件中。 +若你想指定 ini 文件及 chromedriver.exe 的保存路径,可以这样写: + +```python +get_match_driver(ini_path='ini文件路径', save_path='保存路径') +``` + + + +### 使用 set_paths() 方法 + +若上一种方法失败,可自行下载 chromedriver.exe,然后运行以下代码,把路径记录到 ini 文件中。 ```python from DrissionPage.easy_set import set_paths -driver_path = 'D:\\chrome\\chromedriver.exe' # 你的chromedriver.exe路径,若不填写会在系统变量中查找 -chrome_path = 'D:\\chrome\\chrome.exe' # 你的chrome.exe路径,若不填写会在系统变量中查找 +driver_path = 'D:\\chrome\\chromedriver.exe' # 你的 chromedriver.exe 路径,若不填写会在系统变量中查找 +chrome_path = 'D:\\chrome\\chrome.exe' # 你的 chrome.exe 路径,若不填写会在系统变量中查找 set_paths(driver_path, chrome_path) ``` -该方法还会检查chrome和chromedriver版本是否匹配,显示: +该方法还会检查 chrome 和 chromedriver 版本是否匹配,显示: ``` +正在检测可用性... 版本匹配,可正常使用。 +``` -# 或 +或 +``` 出现异常: Message: session not created: Chrome version must be between 70 and 73 (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.19631 x86_64) -chromedriver下载网址:https://chromedriver.chromium.org/downloads +可执行easy_set.get_match_driver()自动下载匹配的版本。 +或自行从以下网址下载:https://chromedriver.chromium.org/downloads ``` -检查通过后,即可正常使用driver模式。 +检查通过后,即可正常使用 driver 模式。 除了上述两个路径,该方法还可以设置以下路径: @@ -396,71 +414,70 @@ Tips: - 不同项目可能须要不同版本的 chrome 和 chromedriver,你还可保存多个 ini 文件,按须使用。 - 推荐使用绿色版 chrome,并手动设置路径,避免浏览器升级造成与 chromedriver 版本不匹配。 -- 调试项目时推荐设置 debugger_address,使用手动打开的浏览器调试,省时省力。 +- 调试项目时推荐设置 debugger_address,使用手动打开的浏览器,再用程序接管,好处多多。 -## 创建驱动器对象Drission +## 创建驱动器对象 Drission -创建的步骤不是必须,若想快速上手,可跳过本节。MixPage 对象会自动创建该对象。 +创建的步骤不是必须,若想快速上手,可跳过本节。MixPage 会自动创建该对象。 Drission 对象用于管理 driver 和 session 对象。在多个页面协同工作时,Drission 对象用于传递驱动器,使多个页面类可控制同一个浏览器或 Session 对象。 可直接读取 ini 文件配置信息创建,也可以在初始化时传入配置信息。 ```python -# 由默认ini文件创建 +# 由默认 ini 文件创建 drission = Drission() -# 由其它ini文件创建 -drission = Drission(ini_path = 'D:\\settings.ini') +# 由其它 ini 文件创建 +drission = Drission(ini_path='D:\\settings.ini') -# 不从ini文件创建 -drission = Drission(read_file = False) +# 不从 ini 文件创建 +drission = Drission(read_file=False) ``` -若要手动传入配置: +若要手动传入配置(不使用 ini 文件): ```python -# 用传入的配置信息创建(忽略ini文件) from DrissionPage.config import DriverOptions -# 创建driver配置对象,read_file = False表示不读取ini文件 -do = DriverOptions(read_file = False) +# 创建 driver 配置对象,read_file = False 表示不读取 ini 文件 +do = DriverOptions(read_file=False) # 设置路径,若已在系统变量设置,可忽略 -do.set_paths(chrome_path = 'D:\\chrome\\chrome.exe', - driver_path = 'D:\\chrome\\chromedriver.exe') +do.set_paths(chrome_path='D:\\chrome\\chrome.exe', + driver_path='D:\\chrome\\chromedriver.exe') # 用于 s 模式的设置 session_options = {'headers': {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)'}} -# 传入配置,driver_options 和 session_options都是可选的,须要使用对应模式才须要传入 +# 传入配置,driver_options 和 session_options 都是可选的,须要使用对应模式才须要传入 drission = Drission(driver_options, session_options) ``` -## 使用页面对象MixPage +## 使用页面对象 MixPage MixPage 页面对象封装了常用的网页操作,并实现 driver 和 session 模式之间的切换。 -MixPage 须接收一个 Drission 对象并使用其中的 driver 或 session,如没有传入,MixPage 会自己创建一个 Drission(使用默认ini文件的配置)。 +MixPage 须接收一个 Drission 对象并使用其中的 driver 或 session,如没有传入,MixPage 会自己创建一个(使用默认 ini 文件的配置)。 -Tips: 多页面对象协同工作时,记得手动创建 Drission 对象并传递给页面对象使用。否则页面对象会各自创建自己的 Drission 对象,使信息无法传递。 +Tips: 多对象协同工作时,可将一个 MixPage 中的 Drission 对象传递给另一个,使多个对象共享登录信息或操作同一个页面。 ### 创建对象 创建对象方式有3种:简易、传入 Drission 对象、传入配置。可根据实际需要选择。 ```python -# 简易创建方式,以ini文件默认配置自动创建Drission对象 +# 简易创建方式,以 ini 文件默认配置自动创建 Drission 对象 page = MixPage() page = MixPage('s') -# 以传入Drission对象创建 +# 以传入 Drission 对象创建 page = MixPage(drission) -page = MixPage(drission, mode='s', timeout=5) # session模式,等待时间5秒(默认10秒) +page = MixPage(drission, mode='s', timeout=5) # session 模式,等待时间5秒(默认10秒) -# 以传入配置信息创建 +# 传入配置信息,MixPage 根据配置在内部创建 Drission page = MixPage(driver_options=do, session_options=so) # 默认 d 模式 ``` @@ -473,7 +490,7 @@ page = MixPage(driver_options=do, session_options=so) # 默认 d 模式 ```python # 默认方式 page.get(url) -page.post(url, data, **kwargs) # 只有session模式才有post方法 +page.post(url, data, **kwargs) # 只有 session 模式才有 post 方法 # 指定重试次数和间隔 page.get(url, retry=5, interval=0.5) @@ -486,7 +503,7 @@ page.get(url, retry=5, interval=0.5) 在 s 和 d 模式之间切换,切换时会自动同步 cookies 和正在访问的 url。 ```python -page.change_mode(go=False) # go为False表示不跳转url +page.change_mode(go=False) # go 为 False 表示不跳转 url ``` @@ -494,20 +511,20 @@ page.change_mode(go=False) # go为False表示不跳转url ### 页面属性 ```python -page.url # 当前访问的url +page.url # 当前访问的 url page.mode # 当前模式 -page.drission # 当前使用的Dirssion对象 -page.driver # 当前使用的WebDirver对象 -page.session # 当前使用的Session对象 -page.cookies # 获取cookies信息 +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.tab_handles # 返回所有标签页 handle 列表 page.current_tab_num # 返回当前标签页序号 -page.current_tab_handle # 返回当前标签页handle +page.current_tab_handle # 返回当前标签页 handle ``` @@ -518,26 +535,26 @@ page.current_tab_handle # 返回当前标签页handle ```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.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对象 +page.close_driver() # 关闭 WebDriver 对象 +page.close_session() # 关闭 Session 对象 # s 模式独有: -page.post(url, data, retry, interval, **kwargs) # 以post方式访问网页,可指定重试次数及间隔时间 +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.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.to_iframe(iframe) # 切入 iframe page.screenshot(path) # 页面截图 page.scrool_to_see(element) # 滚动直到某元素可见 page.scroll_to(mode, pixel) # 按参数指示方式滚动页面,可选滚动方向:'top', 'bottom', 'rightmost', 'leftmost', 'up', 'down', 'left', 'right' @@ -545,7 +562,7 @@ page.refresh() # 刷新当前页面 page.back() # 浏览器后退 page.et_window_size(x, y) # 设置浏览器窗口大小,默认最大化 page.check_page() # 检测页面是否符合预期 -page.chrome_downloading() # 获取chrome正在下载的文件列表 +page.chrome_downloading() # 获取 chrome 正在下载的文件列表 page.process_alert(mode, text) # 处理提示框 ``` @@ -562,36 +579,36 @@ page.eles() 和 element.eles() 查找返回符合条件的所有元素列表。 - 元素查找超时默认为10秒,你也可以按需要设置。 - 下面的查找语句中,冒号 : 表示模糊匹配,等号 = 表示精确匹配 -- 查询字符串有 @属性名、tag、text、xpath、css五种 +- 查询字符串有 @属性名、tag、text、xpath、css 五种 ```python -# 根据属性查找,@后面可跟任意属性 -page.ele('@id:ele_id', timeout = 2) # 查找id为ele_id的元素,设置等待时间2秒 -page.eles('@class') # 查找所有拥有class属性的元素 -page.eles('@class:class_name') # 查找所有class含有ele_class的元素 -page.eles('@class=class_name') # 查找所有class等于ele_class的元素 +# 根据属性查找,@ 后面可跟任意属性 +page.ele('@id:ele_id', timeout=2) # 查找 id 为 ele_id 的元素,设置等待时间2秒 +page.eles('@class') # 查找所有拥有 class 属性的元素 +page.eles('@class:class_name') # 查找所有 class 含有 ele_class 的元素 +page.eles('@class=class_name') # 查找所有 class 等于 ele_class 的元素 -# 根据tag name查找 -page.ele('tag:li') # 查找第一个li元素 -page.eles('tag:li') # 查找所有li元素 +# 根据 tag name 查找 +page.ele('tag:li') # 查找第一个 li 元素 +page.eles('tag:li') # 查找所有 li 元素 -# 根据tag name及属性查找 -page.ele('tag:div@class=div_class') # 查找class为div_class的div元素 -page.ele('tag:div@class:ele_class') # 查找class含有ele_class的div元素 -page.ele('tag:div@class=ele_class') # 查找class等于ele_class的div元素 -page.ele('tag:div@text():search_text') # 查找文本含有search_text的div元素 -page.ele('tag:div@text()=search_text') # 查找文本等于search_text的div元素 +# 根据 tag name 及属性查找 +page.ele('tag:div@class=div_class') # 查找 class 为 div_class 的 div 元素 +page.ele('tag:div@class:ele_class') # 查找 class 含有 ele_class 的 div 元素 +page.ele('tag:div@class=ele_class') # 查找 class 等于 ele_class 的 div 元素 +page.ele('tag:div@text():search_text') # 查找文本含有 search_text 的 div 元素 +page.ele('tag:div@text()=search_text') # 查找文本等于 search_text 的 div 元素 # 根据文本内容查找 page.ele('search text') # 查找包含传入文本的元素 -page.eles('text:search text') # 如文本以@、tag:、css:、xpath:、text:开头,则在前面加上text:避免冲突 -page.eles('text=search text') # 文本等于search_text的元素 +page.eles('text:search text') # 如文本以 @、tag:、css:、xpath:、text: 开头,则在前面加上 text: 避免冲突 +page.eles('text=search text') # 文本等于 search_text 的元素 -# 根据xpath或css selector查找 +# 根据 xpath 或 css selector 查找 page.eles('xpath://div[@class="ele_class"]') page.eles('css:div.ele_class') -# 根据loc查找 +# 根据 loc 查找 loc1 = By.ID, 'ele_id' loc2 = By.XPATH, '//div[@class="ele_class"]' page.ele(loc1) @@ -599,15 +616,15 @@ page.ele(loc2) # 查找下级元素 element = page.ele('@id:ele_id') -element.ele('@class:class_name') # 在element下级查找第一个class为ele_class的元素 -element.eles('tag:li') # 在ele_id下级查找所有li元素 +element.ele('@class:class_name') # 在 element 下级查找第一个 class 为 ele_class 的元素 +element.eles('tag:li') # 在 ele_id 下级查找所有li元素 # 根据位置查找 element.parent # 父元素 element.next # 下一个兄弟元素 element.prev # 上一个兄弟元素 -# 获取shadow-dom,只支持open的shadow-root +# 获取 shadow-dom,只支持 open 的 shadow-root ele1 = element.shadow_root.ele('tag:div') # 串连查找 @@ -623,32 +640,32 @@ ele2 = ele1('tag:li').next('some text') ## 获取元素属性 ```python -element.html # 返回元素outerHTML -element.inner_html # 返回元素innerHTML -element.tag # 返回元素tag name -element.text # 返回元素innerText值 -element.link # 返回元素href或src绝对url +element.html # 返回元素 outerHTML +element.inner_html # 返回元素 innerHTML +element.tag # 返回元素 tag name +element.text # 返回元素 innerText 值 +element.link # 返回元素 href 或 src 绝对 url element.texts() # 返回元素内所有直接子节点的文本,包括元素和文本节点,可指定只返回文本节点 element.attrs # 返回元素所有属性的字典 element.attr(attr) # 返回元素指定属性的值 -element.css_path # 返回元素绝对css路径 -element.xpath # 返回元素绝对xpath路径 +element.css_path # 返回元素绝对 css 路径 +element.xpath # 返回元素绝对 xpath 路径 element.parent # 返回元素父元素 element.next # 返回元素后一个兄弟元素 element.prev # 返回元素前一个兄弟元素 -element.parents(num) # 返回第num级父元素 +element.parents(num) # 返回第 num 级父元素 element.nexts(num, mode) # 返回后面第几个元素或节点 element.prevs(num, mode) # 返回前面第几个元素或节点 element.ele(loc_or_str, timeout) # 返回当前元素下级第一个符合条件的子元素、属性或节点文本 element.eles(loc_or_str, timeout) # 返回当前元素下级所有符合条件的子元素、属性或节点文本 # d 模式独有: -element.before # 获取伪元素before内容 -element.after # 获取伪元素after内容 +element.before # 获取伪元素 before 内容 +element.after # 获取伪元素 after 内容 element.is_valid # 用于判断元素是否还在dom中 element.size # 获取元素大小 element.location # 获取元素位置 -element.shadow_root # 获取元素下的ShadowRoot元素 +element.shadow_root # 获取元素下的 ShadowRoot 元素 element.get_style_property(style, pseudo_ele) # 获取元素样式属性值,可获取伪元素的 element.is_selected() # 返回元素是否被选中 element.is_enabled() # 返回元素是否可用 @@ -662,9 +679,9 @@ element.is_displayed() # 返回元素是否可见 元素操作为 d 模式独有,调用以下方法会自动切换到 d 模式。 ```python -element.click(by_js) # 点击元素,可选择是否用js方式点击 +element.click(by_js) # 点击元素,可选择是否用 js 方式点击 element.input(value) # 输入文本 -element.run_script(js) # 对元素运行JavaScript脚本 +element.run_script(js) # 对元素运行 JavaScript 脚本 element.submit() # 提交 element.clear() # 清空元素 element.screenshot(path, filename) # 对元素截图 @@ -677,29 +694,29 @@ element.hover() # 在元素上悬停鼠标 -## 与selenium代码对接 +## 与 selenium 代码对接 DrissionPage 代码可与 selenium 代码无缝拼接,既可直接使用 selenium 的 WebDriver 对象,也可到处自身的 WebDriver 给 selenium 代码使用。使已有项目的迁移非常方便。 -### selenium转DrissionPage +### selenium 转 DrissionPage ```python driver = webdriver.Chrome() driver.get('https://www.baidu.com') -page = MixPage(Drission(driver)) # 把driver传递给Drission,创建MixPage对象 +page = MixPage(Drission(driver)) # 把 driver 传递给 Drission,创建 MixPage 对象 print(page.title) # 打印结果:百度一下,你就知道 ``` -### DrissionPage转selenium +### DrissionPage 转 selenium ```python page = MixPage() page.get('https://www.baidu.com') -driver = page.driver # 从MixPage对象中获取WebDriver对象 +driver = page.driver # 从 MixPage 对象中获取 WebDriver 对象 print(driver.title) # 打印结果:百度一下,你就知道 ``` @@ -724,7 +741,7 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下 ### 演示 ```python -url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' # 文件url +url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' # 文件 url save_path = r'C:\download' # 存放路径 # 重命名为img.png,存在重名时自动在文件名末尾加上序号,显示下载进度 @@ -734,28 +751,29 @@ page.download(url, save_path, 'img', 'rename', show_msg=True) -## Chrome快捷设置 +## Chrome 快捷设置 chrome 的配置很繁琐,为简化使用,本库提供了常用配置的设置方法。 -### DriverOptions对象 +### DriverOptions 对象 -DriverOptions 对象继承自 selenium.webdriver.chrome.options的Options 对象,在其基础上增加了以下方法: +DriverOptions 对象继承自 selenium.webdriver.chrome.options 的 Options 对象,在其基础上增加了以下方法: ```python -remove_argument(value) # 删除某argument值 -remove_experimental_option(key) # 删除某experimental_option设置 -remove_all_extensions() # 删除全部插件 -save() # 保存配置到默认ini文件 -save('D:\\settings.ini') # 保存到其它路径 -set_argument(arg, value) # 设置argument属性 -set_headless(on_off) # 设置是否使用无界面模式 -set_no_imgs(on_off) # 设置是否加载图片 -set_no_js(on_off) # 设置是否禁用js -set_mute(on_off) # 设置是否静音 -set_user_agent(user_agent) # 设置user agent -set_proxy(proxy) # 设置代理地址 -set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # 设置浏览器相关的路径 +options.remove_argument(value) # 删除某 argument 值 +options.remove_experimental_option(key) # 删除某 experimental_option 设置 +options.remove_all_extensions() # 删除全部插件 +options.save() # 保存当前打开的 ini 文件 +options.save('D:\\settings.ini') # 保存到指定路径 ini 文件 +options.save('default') # 保存当前设置到默认 ini 文件 +options.set_argument(arg, value) # 设置 argument 属性 +options.set_headless(on_off) # 设置是否使用无界面模式 +options.set_no_imgs(on_off) # 设置是否加载图片 +options.set_no_js(on_off) # 设置是否禁用 js +options.set_mute(on_off) # 设置是否静音 +options.set_user_agent(user_agent) # 设置 user agent +options.set_proxy(proxy) # 设置代理地址 +options.set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # 设置浏览器相关的路径 ``` @@ -763,16 +781,17 @@ set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_p ### 使用方法 ```python -do = DriverOptions(read_file=False) # 创建chrome配置对象,不从ini文件读取 +do = DriverOptions(read_file=False) # 创建chrome配置对象,不从 ini 文件读取 do.set_headless(False) # 显示浏览器界面 do.set_no_imgs(True) # 不加载图片 do.set_paths(driver_path='D:\\chromedriver.exe', chrome_path='D:\\chrome.exe') # 设置路径 do.set_headless(False).set_no_imgs(True) # 支持链式操作 -drission = Drission(driver_options=do) # 用配置对象创建Drission对象 -page = MixPage(drission) # 用Drission对象创建MixPage对象 +drission = Drission(driver_options=do) # 用配置对象创建 Drission 对象 +page = MixPage(drission) # 用Drission对象创建 MixPage 对象 -do.save() # 保存配置到默认ini文件 +do.save() # 保存当前打开的 ini 文件 +do.save('default') # 保存当前设置到默认 ini 文件 ``` @@ -783,7 +802,7 @@ do.save() # 保存配置到默认ini文件 Tips:建议把常用配置文件保存到别的路径,以防本库升级时配置被重置。 -### ini文件内容 +### ini 文件内容 ini 文件默认拥有三部分配置:paths、chrome_options、session_options,初始内容如下。 @@ -840,16 +859,20 @@ headers = { -### OptionsManager对象 +### OptionsManager 对象 OptionsManager 对象用于读取、设置和保存配置。 ```python -get_value(section, item) -> str # 获取某个配置的值 -get_option(section) -> dict # 以字典格式返回配置全部属性 -set_item(section, item, value) # 设置配置属性 -save() # 保存配置到默认ini文件 -save('D:\\settings.ini') # 保存到其它路径 +manager.paths # 以字典形式返回路径设置 +manager.chrome_options # 以字典形式返回chrome设置 +manager.session_options # 以字典形式返回session设置 +manager.get_value(section, item) # 获取某个配置的值 +manager.get_option(section) # 以字典格式返回配置全部属性 +manager.set_item(section, item, value) # 设置配置属性 +manager.manager.save() # 保存当前打开的 ini 文件 +manager.save('D:\\settings.ini') # 保存到指定路径 ini 文件 +manager.save('default') # 保存当前设置到默认 ini 文件 ``` @@ -862,19 +885,17 @@ from DrissionPage.configs import * options_manager = OptionsManager() # 从默认ini文件创建OptionsManager对象 options_manager = OptionsManager('D:\\settings.ini') # 从其它ini文件创建OptionsManager对象 driver_path = options_manager.get_value('paths', 'chromedriver_path') # 读取路径信息 -options_manager.save() # 保存到默认ini文件 -options_manager.save('D:\\settings.ini') # 保存到其它路径 +options_manager.save() # 保存当前打开的 ini 文件 +options_manager.save('D:\\settings.ini') # 保存到指定路径 ini 文件 -drission = Drission(ini_path = 'D:\\settings.ini') # 使用其它ini文件创建对象 +drission = Drission(ini_path='D:\\settings.ini') # 使用指定 ini 文件创建对象 ``` -**注意**:保存时若不传入路径,会保存到模块目录下的ini文件,即使读取的不是默认 ini 文件也一样。 +## easy_set 方法 -## easy_set方法 - -调用 easy_set 方法会修改默认ini文件相关内容。 +可快速地修改常用设置的方法,调用 easy_set 方法会修改默认 ini 文件相关内容。 ```python set_headless(True) # 开启 headless 模式 @@ -887,7 +908,7 @@ set_paths(paths) # 见 [初始化] 一节 set_argument(arg, value) # 设置属性,若属性无值(如'zh_CN.UTF-8'),value 为 bool 表示开关;否则value为str,当 value为''或 False,删除该属性项 ``` -# POM模式 +# POM 模式 *** @@ -985,7 +1006,7 @@ print(page.ele('@id:su').text) # 输出:百度一下 *** -## Drission类 +## Drission 类 ### class Drission() @@ -1069,8 +1090,8 @@ Drission 类用于管理 WebDriver 对象和 Session 对象,是驱动器的角 参数说明: - url: str - cookies 的域 -- driver: WebDriver - 接收 cookies 的 WebDriver对象 -- session: Session - 复制 cookies 的 Session对象 +- driver: WebDriver - 接收 cookies 的 WebDriver 对象 +- session: Session - 复制 cookies 的 Session 对象 返回: None @@ -1113,7 +1134,7 @@ Drission 类用于管理 WebDriver 对象和 Session 对象,是驱动器的角 -## MixPage类 +## MixPage 类 ### class MixPage() @@ -1289,7 +1310,7 @@ MixPage 封装了页面操作的常用功能,可在 driver 和 session 模式 参数说明: -- copy_user_agent:bool - 是否同时复制 user agent +- copy_user_agent: bool - 是否同时复制 user agent 返回: None @@ -1301,7 +1322,7 @@ MixPage 封装了页面操作的常用功能,可在 driver 和 session 模式 参数说明: -- url:str - cookies 的域或 url +- url: str - cookies 的域或 url 返回: None @@ -1313,7 +1334,7 @@ MixPage 封装了页面操作的常用功能,可在 driver 和 session 模式 参数说明: -- url: str - 目标url +- url: str - 目标 url - go_anyway: bool - 是否强制跳转。若目标 url 和当前 url 一致,默认不跳转。 - show_errmsg: bool - 是否显示和抛出异常 - retry: int - 连接出错时重试次数 @@ -1326,11 +1347,11 @@ MixPage 封装了页面操作的常用功能,可在 driver 和 session 模式 ### post() -以post方式跳转,调用时自动切换到 session 模式。 +以 post 方式跳转,调用时自动切换到 session 模式。 参数说明: -- url:str - 目标 url +- url: str - 目标 url - data: dict - 提交的数据 - go_anyway: bool - 是否强制跳转。若目标 url 和当前 url 一致,默认不跳转。 - show_errmsg: bool - 是否显示和抛出异常 @@ -1338,7 +1359,7 @@ MixPage 封装了页面操作的常用功能,可在 driver 和 session 模式 - interval: float - 重试间隔(秒) - **kwargs - 用于 requests 的连接参数 -返回: [bool, None] - url是否可用 +返回: [bool, None] - url 是否可用 @@ -1442,7 +1463,7 @@ d 模式时检查网页是否符合预期。默认由 response 状态检查, 参数说明: -- url:str - 新标签页跳转到的网址 +- url: str - 新标签页跳转到的网址 返回: None @@ -1486,7 +1507,7 @@ d 模式时检查网页是否符合预期。默认由 response 状态检查, 参数说明: -- loc_or_ele:[int, str, tuple, WebElement, DriverElement] - 查找 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 的查询字符串定位 @@ -1507,7 +1528,7 @@ d 模式时检查网页是否符合预期。默认由 response 状态检查, 参数说明: -- loc_or_ele:[str, tuple, WebElement, DriverElement] - 查找元素的条件,和 ele() 方法的查找条件一致。 +- loc_or_ele: [str, tuple, WebElement, DriverElement] - 查找元素的条件,和 ele() 方法的查找条件一致。 返回: None @@ -1609,7 +1630,7 @@ d 模式时检查网页是否符合预期。默认由 response 状态检查, -## DriverElement类 +## DriverElement 类 ### class DriverElement() @@ -2054,7 +2075,7 @@ driver 模式的元素对象,包装了一个 WebElement 对象,并封装了 -## SessionElement类 +## SessionElement 类 ### class SessionElement() @@ -2223,7 +2244,7 @@ session 模式的元素对象,包装了一个Element对象,并封装了常 - loc_or_str:[Tuple[str, str], str] - 查询条件参数 -- mode:str - 查找一个或多个,传入 'single' 或 'all' +- mode: str - 查找一个或多个,传入 'single' 或 'all' 示例: @@ -2274,7 +2295,7 @@ session 模式的元素对象,包装了一个Element对象,并封装了常 -## OptionsManager类 +## OptionsManager 类 ### class OptionsManager() @@ -2282,7 +2303,7 @@ session 模式的元素对象,包装了一个Element对象,并封装了常 参数说明: -- path:str - ini文件路径,不传入则默认读取当前文件夹下的 configs.ini 文件 +- path: str - ini文件路径,不传入则默认读取当前文件夹下的 configs.ini 文件 @@ -2355,13 +2376,13 @@ session 模式的元素对象,包装了一个Element对象,并封装了常 参数说明: -- path:str - ini 文件的路径,默认保存到模块文件夹下的 +- path: str - ini 文件的路径,传入 'default' 保存到默认ini文件 返回: OptionsManager - 返回自己 -## DriverOptions类 +## DriverOptions 类 ### class DriverOptions() @@ -2369,7 +2390,8 @@ chrome 浏览器配置类,继承自 selenium.webdriver.chrome.options 的 Opti 参数说明: -- read_file:bool - 创建时是否从 ini 文件读取配置信息 +- read_file: bool - 创建时是否从 ini 文件读取配置信息 +- ini_path: str - ini 文件路径,为None则读取默认 ini 文件 @@ -2395,7 +2417,7 @@ chrome.exe 的路径 参数说明: -- path:str - ini 文件的路径,默认保存到模块文件夹下的 +- path: str - ini 文件的路径,传入 'default' 保存到默认ini文件 返回: DriverOptions - 返回自己 @@ -2407,7 +2429,7 @@ chrome.exe 的路径 参数说明: -- value:str - 要移除的属性值 +- value: str - 要移除的属性值 返回: DriverOptions - 返回自己 @@ -2419,7 +2441,7 @@ chrome.exe 的路径 参数说明: -- key:str - 要移除的实验设置 key 值 +- key: str - 要移除的实验设置 key 值 返回: DriverOptions - 返回自己 @@ -2439,7 +2461,7 @@ chrome.exe 的路径 参数说明: -- arg:str - 属性名 +- arg: str - 属性名 - value[bool, str] - 属性值,有值的属性传入值,没有的传入 bool 返回: DriverOptions - 返回自己 @@ -2500,7 +2522,7 @@ on_off: bool - 打开或关闭 参数说明: -- user_agent:str - user agent 字符串 +- user_agent: str - user agent 字符串 返回: DriverOptions - 返回自己 @@ -2512,7 +2534,7 @@ on_off: bool - 打开或关闭 参数说明: -- proxy:str - 代理地址 +- proxy: str - 代理地址 返回: DriverOptions - 返回自己 @@ -2524,18 +2546,18 @@ on_off: bool - 打开或关闭 参数说明: -- 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 - 缓存路径 +- 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 - 返回自己 -## easy_set方法 +## easy_set 方法 chrome 配置太复杂,所以把常用的配置写成简单的方法,调用会修改 ini 文件相关内容。 @@ -2543,6 +2565,11 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 自动识别 chrome 版本并下载匹配的driver。获取 ini 文件记录的 chrome.exe 路径,若没有则获取系统变量中的。 +参数说明: + +- ini_path: str - 要读取和修改的 ini 文件路径 +- save_path: str - chromedriver 保存路径 + 返回: None @@ -2551,24 +2578,29 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 打印 ini 文件中所有配置信息。 +参数说明: + +- ini_path: str - ini 文件路径,为 None 则读取默认 ini 文件 + 返回: None ### set_paths() -便捷的设置路径方法,把传入的路径保存到默认 ini 文件,并检查 chrome 和 chromedriver 版本是否匹配。 +便捷的设置路径方法,把传入的路径保存到 ini 文件,并检查 chrome 和 chromedriver 版本是否匹配。 参数说明: -- 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 是否匹配 +- 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 - 缓存路径 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 +- check_version: bool - 是否检查 chromedriver 和 chrome 是否匹配 返回: None @@ -2576,12 +2608,13 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 ### set_argument() -设置属性。若属性无值(如'zh_CN.UTF-8'),value传入bool表示开关;否则value传入str,当value为''或False,删除该属性项。 +设置属性。若属性无值(如 'zh_CN.UTF-8' ),value 传入 bool 表示开关;否则把 value 赋值给属性,当 value 为 '' 或 False,删除该属性项。 参数说明: -- arg:str - 属性名 -- value[bool, str] - 属性值,有值的属性传入值,没有的传入bool +- arg: str - 属性名 +- value: [bool, str] - 属性值,有值的属性传入值,没有的传入 bool +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2589,11 +2622,12 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 ### set_headless() -开启或关闭headless模式。 +开启或关闭 headless 模式。 参数说明: -- on_off: bool - 是否开启headless模式 +- on_off: bool - 是否开启 headless 模式 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2606,6 +2640,7 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 参数说明: - on_off: bool - 是否开启无图模式 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2613,11 +2648,12 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 ### set_no_js() -开启或关闭禁用JS模式。 +开启或关闭禁用 JS 模式。 参数说明: -- on_off: bool - 是否开启禁用JS模式 +- on_off: bool - 是否开启禁用 JS 模式 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2630,6 +2666,7 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 参数说明: - on_off: bool - 是否开启静音模式 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2637,11 +2674,12 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 ### set_user_agent() -设置user_agent。 +设置 user_agent。 参数说明: -- user_agent: str - user_agent值 +- user_agent: str - user_agent 值 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2654,6 +2692,7 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 参数说明: - proxy: str - 代理值 +- ini_path: str - ini 文件路径,为 None 则保存到默认 ini 文件 返回: None @@ -2661,11 +2700,11 @@ chrome 配置太复杂,所以把常用的配置写成简单的方法,调用 ### check_driver_version() -检查chrome与chromedriver版本是否匹配。 +检查 chrome 与 chromedriver 版本是否匹配。 参数说明: -- driver_path: bool - chromedriver.exe路径 -- chrome_path: bool - chrome.exe路径 +- driver_path: bool - chromedriver.exe 路径 +- chrome_path: bool - chrome.exe 路径 返回: bool \ No newline at end of file