文章目录
python模块——selenium 详细
一.安装
-
1.Windows
- 在cmd中输入:
pip install selenium
即可安装selenium模块 - 配合驱动让浏览器上来自己动:
chrome 全系列下载地址、
Firefox 全系列下载地址、
IE 全系列下载地址 - 下载好对应自己浏览器版本的驱动后,可以吧下载下来的exe放进项目目录下就可以调用了
- 在cmd中输入:
-
2.linux(ubuntu)
- 打开终端输入:
pip install selenium
- 驱动下载地址:chrome 全系列下载地址、
Firefox 全系列下载地址、
IE 全系列下载地址 - 选择自己对应的系统下载,下载下来后解压可以使用命令:
tar zxvf 包名
、剪切到 /usr/bin目录下使用命令:sudo mv 解压出来的文件 /usr/bin
- 打开终端输入:
二.常用方法详细
-
1.创建实例
- selenium.webdriver 模块提供了所有WebDriver的实现
from selenium import webdriver driver = webdriver.Chrome() # 创建chrome实例 driver = webdriver.Firefox() # 创建Fierfox 实例
-
2.打开某个地址
- driver.get()方法将打开指定的URL地址,直到页面完全加载完毕,返回继续执行,如果页面使用大量的Ajax 加载, WebDriver可能不知道什么时候页面已经完全加载
from selenium import webdriver driver = webdriver.Chrome() # 创建chrome实例 driver.get("www.zhihuishu.com")
-
3.定位元素(重点)
元素 方法 异常 id driver.find_element_by_id() NoSuchElementException name driver.find_element_by_name() NoSuchElementException class_name driver.find_element_by_class_name() NoSuchElementException link_txet driver.find_element_by_link_text() NoSuchElementException tag_name driver.find_element_by_tag_name() NoSuchElementException xpath driver.find_element_by_xpath NoSuchElementException css driver.find_element_by_css_selector() NoSuchElementException partial_link_text driver.find_element_by_partial_link_text() NoSuchElementException - 举个栗子:
<html> <body> <form id="loginForm"> <p class="content">Site content goes here.</p> <h1>Welcome</h1> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> <p class="content">Site content goes here.</p> <p>Are you sure you want to do this?</p> <a href="continue.html">Continue</a> <a href="cancel.html">Cancel</a> </form> </body> <html>
-
示例
- 通过ID定位:
login_form = driver.find_element_by_id('loginForm')
- 通过Name定位:
username = driver.find_element_by_name('username')
- 通过Xpath定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
绝对定位 (页面结构轻微调整就会被破坏) - 链接文本获取超链接:
continue_link = driver.find_element_by_link_text('Continue')
- 标签名查找元素:
heading1 = driver.find_element_by_tag_name('h1')
- Class name 定位元素:
content = driver.find_element_by_class_name('content')
- CSS选择器查找元素:
content = driver.find_element_by_css_selector('p.content')
- 通过ID定位:
-
3.2:私有两个方法
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')
- 可用属性:
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"
-
3.3:模糊匹配
-
匹配头部:
self.driver.find_element_by_css_selector('div[style^="sp.gif"]').click()
-
匹配尾部:
self.driver.find_element_by_css_selector('div[style$="sp.gif"]').click()
-
匹配中间:
self.driver.find_element_by_css_selector('div[style*="sp.gif"]').click()
-
xpath中的模糊匹配:
-
匹配开始:
starts-with
比如:driver.find_elements_by_xpath('//li[starts-with(@class,"clearfix video")]')
-
匹配属性中包含的字符串:
contains
比如:driver.find_elements_by_xpath('//li[contains(@class,"clearfix video")]')
-
匹配显示文本信息:
text()
比如:driver.find_elements_by_xpath(//a[text()='智慧树'])
-
-
-
4.等待
现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。
-
显式等待:(重要)
会让WebDriver等待满足一定的条件以后再进一步的执行。
使用方法:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)
WebDriverWait结合ExpectedCondition 是实现的一种方式
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 WebDriverWait (driver, timeout=True, poll_frequency=10).until (EC.presence_of_element_located ((By.CLASS_NAME, "topic-item"))) # 如果在timeout的时间内没有找到就会抛出` TimeoutException` 异常
- 解释:
-
driver当前实例的对象
-
timeout:最长等待的时间
-
poll_frequency:多少秒检测一次 默认0.5
-
EC.presence_of_element_located ((By.CLASS_NAME, “topic-item”)):判断class_name=topic-item元素是否已经成功加载。
-
忽略异常:如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
-
- 解释:
-
WebDriverWait()类
-
until()方法:条件成立为真
-
until_not()方法:条件不成立为真也就是没有指定的元素为真
-
-
expected_conditions()类
-
element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态
-
element_selection_state_to_be():判断给定的元素是否被选中
-
element_located_to_be_selected():期望某个元素处于被选中状态
-
element_to_be_selected():期望某个元素处于选中状态
-
element_to_be_clickable():判断元素是否可见并且能被单击,条件满足返回页面元素对象,否则返回Flase
-
frame_to_be_available_and_switch_to_it():判断frame是否可用
-
invisibility_of_element_located():希望某个元素不可见或者不存在DOM中,满足条件返回True,否则返回定位到的元素对象
-
visibility_of_element_located():希望某个元素出现在DOM中并且可见,满足条件返回该元素的页面元素对象
-
visibility_of():希望某个元素出现在页面的DOM中,并且可见,满足条件返回该元素的页面元素对象
-
visibility_of_any_elements_located():希望某个元素出现在DOM中并且可见
-
presence_of_all_elements_located():判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的压面元素
-
presence_of_element_located(locator):判断某个元素是否存在DOM中,不一定可见,存在返回该元素对象
-
staleness_of(webelement):判断一个元素是否仍在DOM中,如果在规定时间内已经移除返回True,否则返回Flase
-
text_to_be_present_in_element():判断文本内容test是否出现在某个元素中,判断的是元素的text
-
text_to_be_present_in_element_value():判断text是否出现在元素的value属性值中
-
title_contains():判断页面title标签的内容包含partial_title,只需要部分匹配即可,包含返回True,不包含返回Flase
-
title_is():判断页面title内容是与传入的title_text内容完全匹配,匹配返回True,否则返回Flase
-
-
-
隐式等待
让Webdriver等待一定的时间后再才是查找某元素。
implicitly_wait(3)
如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束
-
强制等待
- 强制让浏览器等待,不管当前操作是否完成
import time time.sleep(3)
-
5.鼠标操作
- Action Chains类常用于模拟鼠标的行为,比如单击,双击,拖拽等行为
from selenium.webdriver.common.action_chains import ActionChains
- 常用方法
- click() 鼠标单击
- click_and_hold() 鼠标单击长按
- context_click() 右击
- double_click() 双击
- drag_and_drop_by_offset(source, xoffset, yoffset)
- source: The element to mouse down.
- xoffset: X offset to move to.
- yoffset: Y offset to move to.
- key_down() 按下某个键
- key_up()放开某键
-
6.键盘操作
from selenium.webdriver.common.keys import Keys
- 常用按键(其他可以查看keys.py文件)
- 组合
- send_keys(Keys.CONTROL,‘a’) # 全选(Ctrl+A)
- send_keys(Keys.CONTROL,‘c’) # 复制(Ctrl+C)
- send_keys(Keys.CONTROL,‘x’) # 剪切(Ctrl+X)
- send_keys(Keys.CONTROL,‘v’) # 粘贴(Ctrl+V)
- 非组合
- 回车键:Keys.ENTER
- 删除键:Keys.BACK_SPACE
- 空格键:Keys.SPACE
- 制表键:Keys.TAB
- 回退键:Keys.ESCAPE
- 刷新键:Keys.F5
- 组合
-
7.执行js
- 为什么要用js
- 在做自动化的时候可能遇见无法对元素操作的情况,比如在做智慧树登录的时候,直接使用webdriver 点击登录是会被检测到的
- 内置方法
driver.execute_script()
- 栗子:
- 进行输入内容
driver.execute_script ('document.getElementById("lUsername").value="{}"'.format (username))
- 进行点击
driver.execute_script ('document.getElementById("lUsername").click())
- 进行输入内容
- 为什么要用js
-
8.chrome options参数
- chrome options 是配置chrome启动时属性的类
- 设置 chrome 二进制文件位置 (binary_location)
- 添加启动参数 (add_argument)
- 设置ua
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"') driver = webdriver.Chrome(chrome_options = options)
- 设置ip代理
from selenium import webdriver options = webdriver.ChromeOptions () chromeOptions = webdriver.ChromeOptions() chromeOptions.add_argument('--proxy-server=http://ip:port') # 设置ip还有端口 driver = webdriver.Chrome(chrome_options=chromeOptions)
- 其他常用
chrome_options.add_argument('--user-agent=""') # 设置请求头的User-Agent chrome_options.add_argument('--window-size=1280x1024') # 设置浏览器分辨率(窗口大小) chrome_options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错 chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示 chrome_options.add_argument('--incognito') # 隐身模式(无痕模式) chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument('--disable-javascript') # 禁用javascript chrome_options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度 chrome_options.add_argument('--headless') # 浏览器不提供可视化页面 chrome_options.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化 chrome_options.add_argument('--disable-gpu') # 禁用GPU加速 chrome_options.add_argument('–disable-software-rasterizer') chrome_options.add_argument('--disable-extensions') # 禁用扩展 chrome_options.add_argument('--start-maximized') # 最大化
- 添加扩展应用 (add_extension, add_encoded_extension)
- 添加插件
extension_path = '插件路径' chrome_options.add_extension(extension_path)
- 添加实验性质的设置参数 (add_experimental_option)
- 禁止图片加载
from selenium import webdriver chrome_options = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images": 2} chrome_options.add_experimental_option("prefs", prefs)
- 禁用保存密码
prefs = {"": ""} prefs["credentials_enable_service"] = False prefs["profile.password_manager_enabled"] = False chrome_options.add_experimental_option ("prefs", prefs)
- 禁用弹窗
禁用浏览器弹窗 prefs = { 'profile.default_content_setting_values' : { 'notifications' : 2 } } chrome_options.add_experimental_option('prefs',prefs)
- 设置调试器地址 (debugger_address)
- cookie
- 设置cookie
driver.delete_all_cookies()# 删除cookie driver.add_cookie({'name':'ABC','value':'DEF'}) # 携带cookie driver.get_cookies() # 获取cookie
- chrome options 是配置chrome启动时属性的类
公众号:Linux下撸python
期待和你再次相遇
愿你学的愉快