Selenium
## 安装selenium ```python pip install selenium ``` ## 安装驱动 驱动安装地址: - Firefox 浏览器驱动:https://github.com/mozilla/geckodriver/releases - Chrome 浏览器驱动:https://chromedriver.storage.googleapis.com/index.html - IE 浏览器驱动:http://selenium-release.storage.googleapis.com/index.html - Edge 浏览器驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ - PhantomJS 浏览器驱动:https://phantomjs.org/ - Opera 浏览器驱动:https://github.com/operasoftware/operachromiumdriver/releases 将驱动放到项目目录下,或者为驱动路径配置环境变量,也可以直接指定驱动路径。 ```python # 指定驱动路径 driver = webdriver.Chrome(executable_path=path) ``` ## 使用示例 ```python from selenium import webdriver # Chrome浏览器 # 保持浏览器打开状态 option = webdriver.ChromeOptions() option.add_experimental_option("detach", True) driver = webdriver.Chrome(chrome_options=option) # 设置参数 url = 'https://leafbackaut.cn/' # 发起请求 driver.get(url) ``` ## 元素定位 元素定位可以根据id,class等属性定位,也可以根据标签名等信息进行定位。使用定位函数后会返回一个WebElement类或一个WebElement类的列表,用于接下来的操作。 ### 旧版元素定位 根据id定位 ```python driver.find_element_by_id(id) ``` 根据name定位 ```python driver.find_element_by_name(name) ``` 根据class定位(返回列表) ```python driver.find_elements_by_class_name(class_name) ``` 根据tag定位(返回列表) ```python driver.find_elements_by_tag_name(tag_name) ``` 根据xpath定位 ```python driver.find_element_by_xpath(xpath) ``` 根据css选择器定位(返回列表) ```python driver.find_element_by_css_selector(css_selector) ``` 根据文本定位(标签必须包含全部文本)(返回列表) ```python driver.find_element_by_link_text(text) ``` 根据部分文本定位(返回列表) ```python driver.find_element_by_partial_link_text(text) ``` ### 新版元素定位(推荐) 新版元素定位将所有定位函数封装成两个函数 ```python # 返回定位到的第一个元素 find_element(self, by=By.ID, value=None) # 返回列表 find_elements(self, by=By.ID, value=None) ``` 其中By的属性如下: ``` ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" ``` 使用方法: ```python from selenium.webdriver.common.by import By # 通过class定位元素 hello = driver.find_elements(By.CLASS_NAME, 'hello') # 也可以不传入By,直接用属性值 world = driver.find_element('id', 'world') ``` ## 元素等待 当元素还没有被加载出来时,会因为定位元素失败而报错,因此需要使用元素等待来保证程序正常运行。 ### 显式等待 设置一个超时时间,期间确定某个条件触发,则继续运行程序,否则抛出异常。 ```python WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) ``` 参数说明: - driver:浏览器驱动 - timeout:超时时间,单位秒 - poll_frequency:每次检测的间隔时间,默认为0.5秒 - ignored_exceptions:指定忽略的异常,默认为NoSuchElementException 判断条件: ```python until(method, message='') until_not(method, message='') ``` 参数说明: - method:每隔一段时间调用这个方法 - message:如果超时,抛出TimeoutException,并显示message中的内容 使用示例: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 打开浏览器 driver = webdriver.Chrome() url = 'https://leafbackaut.cn/' driver.get("url") # 元素等待 # 锁定id为world的元素 try: world = WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID,"world")) ) finally: driver.quit() ``` EC包含了许多通用判断条件,具体如下: - title_is - title_contains - presence_of_element_located - visibility_of_element_located - visibility_of - presence_of_all_elements_located - text_to_be_present_in_element - text_to_be_present_in_element_value - frame_to_be_available_and_switch_to_it - invisibility_of_element_located - element_to_be_clickable - staleness_of - element_to_be_selected - element_located_to_be_selected - element_selection_state_to_be - element_located_selection_state_to_be - alert_is_present ### 隐式等待 设置一个超时时间,如果超出这个时间,还有元素没有被加载出来,就会抛出NoSuchElementException异常,没超时则不影响后面的代码运行。 ```python # time_to_wait为等待时间,单位为s implicitly_wait(self, time_to_wait) ``` 使用示例: ```python from selenium import webdriver # 打开浏览器 driver = webdriver.Chrome(chrome_options=option) url = 'https://leafbackaut.cn/' driver.get(url) # 隐式等待 driver.implicitly_wait(5) try: world = driver.find_element(By.ID, 'world') except Exception as e: print(e) ``` ## 鼠标控制 用元素定位获取WebElement对象后,可以调用鼠标控制方法来完成特定的操作。同时鼠标操作都封装在ActionChains类中,一般都通过ActionChains完成鼠标控制。 ### 鼠标控制方法 - click():单击左键 - context_click():单击右键 - double_click():双击 - drag_and_drop():拖动 - move_to_element():鼠标悬停 - perform():执行所有ActionChains中存储的动作 ### 使用方法 ```python # function为鼠标控制方法 ActionChains(driver).function(element).perform() ``` ### 使用示例 ```python from selenium.webdriver.common.action_chains import ActionChains # 省略打开浏览器的步骤,dirver还是dirver # 获取元素 world = driver.find_element(By.ID, 'world') # 单击元素 ActionChains(driver).click(world).perform() # 拖动元素 # 将hello拖到world上 hello = driver.find_element(By.ID, 'hello') ActionChains(driver).drag_and_drop(hello, world).perform() ``` ## 键盘控制 webdriver中Keys类提供了键盘上的所有按键类型,通过WebElement类的send_keys()方法发送键盘信号。 ### Keys类 ```python class Keys: """ Set of special keys codes. """ NULL = '\ue000' CANCEL = '\ue001' # ^break HELP = '\ue002' BACKSPACE = '\ue003' BACK_SPACE = BACKSPACE TAB = '\ue004' CLEAR = '\ue005' RETURN = '\ue006' ENTER = '\ue007' SHIFT = '\ue008' LEFT_SHIFT = SHIFT CONTROL = '\ue009' LEFT_CONTROL = CONTROL ALT = '\ue00a' LEFT_ALT = ALT PAUSE = '\ue00b' ESCAPE = '\ue00c' SPACE = '\ue00d' PAGE_UP = '\ue00e' PAGE_DOWN = '\ue00f' END = '\ue010' HOME = '\ue011' LEFT = '\ue012' ARROW_LEFT = LEFT UP = '\ue013' ARROW_UP = UP RIGHT = '\ue014' ARROW_RIGHT = RIGHT DOWN = '\ue015' ARROW_DOWN = DOWN INSERT = '\ue016' DELETE = '\ue017' SEMICOLON = '\ue018' EQUALS = '\ue019' NUMPAD0 = '\ue01a' # number pad keys NUMPAD1 = '\ue01b' NUMPAD2 = '\ue01c' NUMPAD3 = '\ue01d' NUMPAD4 = '\ue01e' NUMPAD5 = '\ue01f' NUMPAD6 = '\ue020' NUMPAD7 = '\ue021' NUMPAD8 = '\ue022' NUMPAD9 = '\ue023' MULTIPLY = '\ue024' ADD = '\ue025' SEPARATOR = '\ue026' SUBTRACT = '\ue027' DECIMAL = '\ue028' DIVIDE = '\ue029' F1 = '\ue031' # function keys F2 = '\ue032' F3 = '\ue033' F4 = '\ue034' F5 = '\ue035' F6 = '\ue036' F7 = '\ue037' F8 = '\ue038' F9 = '\ue039' F10 = '\ue03a' F11 = '\ue03b' F12 = '\ue03c' META = '\ue03d' COMMAND = '\ue03d' ZENKAKU_HANKAKU = '\ue040' ``` ### 使用方法 ```python # element为一个WebElement对象 # 向element发送message element.send_keys(message) ``` ### 使用示例 ```python from selenium.webdriver.common.keys import Keys world = driver.find_element(By.ID, 'world') # 发送信息 world.send_keys('hello') # 复制元素内容 world.send_keys(Keys.CONTROL, 'c') ``` ## 浏览器控制 webdriver提供一些内置方法来操作浏览器对象。 ### 修改窗口大小 ```python # 设置窗口大小宽500,高300 driver.set_window_size(500, 300) # 最大化 driver.maximize_window() ``` ### 前进与后退 ```python # 前进 driver.forward() # 后退 driver.back() ``` ### 执行js代码 ```python # js为JavaScript代码 driver.execute_script(js) ``` ### 刷新页面 ```python # 刷新页面 driver.refresh() ``` ### 切换页面 ```python # 获取打开的多个页面句柄 windows = driver.window_handles # 页面按打开时间顺序排序 # 切换到当前最新打开的页面 driver.switch_to.window(windows[-1]) ``` ### 切换到frame ```python # 切换到frame # 可以提供id,name,xpath去定位frame driver.switch_to.frame(id_name_xpath) # 另一种方法 # frame = driver.find_element(By.ID, 'frame') # driver.switch_to.frame(frame) # 接下来开始操作frame里的元素 # 定位frame中的id为world的元素 world = driver.find_element(By.ID, 'world') world.click() # 回到父frame dirver.switch_to.parent_frame() # 回到根frame dirver.switch_to.default_content() ``` ## 弹窗处理 ### 定位到弹窗 ```python driver.switch_to.alert ``` ### 弹窗方法 - text:获取弹窗中的文字 - accept:接受(确认)弹窗内容 - dismiss:解除(取消)弹窗 - send_keys:发送文本至警告框 ### 使用示例 ```python alert = driver.switch_to.alert # 打印alert弹窗的文本 print(alert.text) # 发送字符串 alert.send_keys("hello world") ``` ## 操作Cookie ### 操作方法 - get_cookies:以字典的形式返回当前会话中可见的 cookie 信息 - get_cookie(name):返回 cookie 字典中 key == name 的 cookie 信息 - add_cookie(cookie_dict):将 cookie 添加到当前会话中 - delete_cookie(name):删除指定名称的单个 cookie - delete_all_cookies():删除会话范围内的所有 cookie ## 其它操作 ### 关闭页面 ```python driver.close() ``` ### 截图 ```python # path为图片保存路径 driver.get_screenshot_as_file(path) ``` ### 获取当前url ```python driver.current_url ``` ### 获取当前html源码 ```python driver.page_source ``` ### 获取当前页面标题 ```python driver.title ``` ### 获取浏览器名称 ```python driver.name ``` ### 对页面进行截图 ```python driver.get_screenshot_as_png() ``` ### 获取浏览器尺寸 ```python driver.get_window_size() ``` ### 获取浏览器尺寸,位置 ```python driver.get_window_rect() ``` ### 获取浏览器位置 ```python driver.get_window_position() ``` ### 设置浏览器尺寸 ```python driver.set_window_size(width=1000, height=600) ``` ### 设置浏览器位置 ```python driver.set_window_position(x=500, y=600) ``` ### 设置浏览器的尺寸,位置 ```python driver.set_window_rect(x=200, y=400, width=1000, height=600) ```
创建时间:2023-07-30
|
最后修改:2023-12-27
|
©允许规范转载
酷酷番茄
首页
文章
友链