selenium
支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试。selenium也是支持无界面浏览器操作的。
使用selenium+chromedriver模拟浏览器行为获取数据
selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
安装
pip install selenium
chromedriver是需要去网上下载的,必须下载与自己浏览器版本一致的,版本高了我不知道行不行,但低了是肯定不行的这是下面是chromedriver下载地址,注意使用要有一个谷歌浏览器哦
http://npm.taobao.org/mirrors/chromedriver/
下载完成后,放到不需要权限的纯英文目录下就可以了,建议放在python环境中,也就是你python.exe所在的那个文件夹,这样就不用每次都添加了,但是过期了就要及时更新哦,也就是把新版本放进去,旧的删了
快速入门
from selenium import webdriver
# chromedriver的绝对路径
driver_path = '/Users/apple/soft/chromedriver' # 这里是你下载chromedriver.exe的绝对路径,相对路径也是可以的,但你要知道怎么写相对路径
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 如果你将chromedriver.exe添加到了你的python环境中,上面的就可以简写成
# driver = webdriver.Chrome()
# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)
定位元素
driver.close():关闭当前页面。
driver.quit():退出整个浏览器。
find_element_by_id:根据id来查找某个元素
submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
find_element_by_class_name:根据类名查找元素
submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
find_element_by_name:根据name属性的值来查找元素
submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
find_element_by_tag_name:根据标签名来查找元素
submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
find_element_by_xpath:根据xpath语法来获取元素
submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
find_element_by_css_selector:根据css选择器选择元素
submitTag = driver.find_element_by_css_selector('.s_ipt')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'.s_ipt')
注意:find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。
操作表单元素
你先要定位到这个元素
1.操作输入框
- 找到这个元素:
inputTag = driver.find_element_by_id(‘kw’) - 填充数据:
inputTag.send_keys(‘python’) - 清除数据:
inputTag.clear()
2.操作checkbox
- 找到元素:
rememberTag = driver.find_element_by_name(“session_remember_me”) - 选中或取消:
rememberTag.click()
3.选择select
- 导入包
from selenium.webdriver.support.ui import Select - 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name(“sm”)) - 根据索引选择
selectTag.select_by_index(1) - 根据值选择
selectTag.select_by_value(“1”) - 根据可视的文本选择
selectTag.select_by_visible_text(“按时间顺序”)
4.操作按钮
- 找元素:
inputTag = driver.find_element_by_id(‘su’) - 点击
inputTag.click()
Cookie操作
- 获取所有的cookie
driver.get_cookies() - 根据cookie的key获取value
driver.get_cookie(key) - 删除所有的cookie
driver.delete_all_cookies() - 删除某个cookie
driver.delete_cookie(key)
页面等待
1.隐式等待
调用driver.implicitly_wait。就是在创建driver时,设置全局元素等待超时时间。如果找到元素就继续执行。没有找到就不断刷新页面寻找元素,超过时间抛出异常
driver.implicitly_wait(10)
例:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=')
obj = driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div[6]/div[2]/div/div/div[1]/span[1]/a')
obj.click()
2.显示等待
显示等待是针对特定的元素,这个元素在某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成
例:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://cn.hoyoyo.com/member~login.html')
# 判断登录状态
WebDriverWait(driver, 100).until(
EC.url_to_be('https://cn.hoyoyo.com/my_account~index.html')
)
driver.get('https://cn.hoyoyo.com/my_account~profile.html')
切换页面
- 打开一个新的页面:
driver.execute_script(“window.open(‘网址’)”)
网址要用引号包裹起来 - 切换到这个新的页面中:
driver.switch_to.window(driver.window_handles[1])
第一个页面为0,第二个页面为1,以此类推
例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(2)
# execute_script 方法是用来执行 js 的语法,用 引号 把js的 语法包起来
# driver.execute_script("alert('hello world')")
# window.open() 是 js 的语法,作用是在 新的tab页中 打开一个网站
# 参数就是 打开的 网址
driver.execute_script("window.open('https://www.chinaz.com')")
# current_url 表示driver 当前定位的 页面地址
# print(driver.current_url)
# obj = driver.find_element_by_id('kw')
# print(obj)
# 如果想要 获取 第二个 tab页中的 元素对象,那么必须从第一个tab页切换到 第二个tab页
# 切换的方法是 driver.switch_to.window(), 参数就是 第一个 tab 页面
# 参数的 表示方法是 driver.window_handles, 这个属性是一个列表,每一个值就是 不同的tab 对象
# tab 的对象 下标从 0 开始
# 例如 driver.window_handles[0] 表示第一个 tab 对象,driver.window_handles[1] 表示第二个 tab 对象,以此类推
driver.switch_to.window(driver.window_handles[1])
# print(driver.current_url)
# 新打开 chinaz.com 之后, 从 源代码中 获取 class="header-logo" 的 div 对象
# obj = driver.find_element_by_class_name('header-logo')
# print(obj)
time.sleep(2)
# 关闭 第二个 tab 页,然后在 第一个 tab 页中找 百度一下 这个按钮对象
driver.close()
# 虽然关闭了第二个tab页面,但是 driver 还停留在 这个页面
# 所以如果要去第一个 tab 页中获取数据,必须 切换回 第一个 tab页
driver.switch_to.window(driver.window_handles[0])
obj = driver.find_element_by_id('su')
print(obj)
设置代理ip
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver = webdriver.Chrome(chrome_options=options)
driver.get('http://httpbin.org/ip')
iframe
- 切换到 iframe 里面
driver.switch_to.frame(‘popup_login_frame’) - 返回 最外层 页面
driver.switch_to.default_content()
例:
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 隐式加载, 只针对当前的页面,对iframe中的页面是没有任何效果的
# driver.implicitly_wait(5)
driver.get('http://www.4399.com/')
# 1,找到 登录 链接点击
btn = driver.find_element_by_id('login_tologin')
btn.click()
# 2,由于 用户名的 input框是 在 iframe 页面中
# 所以必须由当前的页面切换到 iframe 的页面中
# frame中的参数就是 iframe 标签中 name 属性的值
driver.switch_to.frame('popup_login_frame')
# 3,定位到 弹出框的 用户名input,填写数据
driver.find_element_by_id('username').send_keys('你的4399账号')
driver.find_element_by_id('j-password').send_keys('你的4399密码')
time.sleep(1)
# 点击登录
driver.find_element_by_xpath('//*[@id="login_form"]/fieldset/div[5]/input').click()
time.sleep(1)
# 虽然页面回自动关闭 iframe的弹框,但是页面还停留在 iframe中
# 所以如果要获取外部的元素,必须 切换到 外部
driver.switch_to.default_content()
# 点击用户名,跳到个人中心
driver.find_element_by_xpath('//*[@id="logined"]').click()
常用的属性
- get_attribute:这个标签的某个属性的值。
- text: 获取标签中的文本
- save_screenshot:获取当前页面的截图。这个方法只能在driver上使用
百度首页例子:
# 导入webdriver的包
import time
from selenium import webdriver
# 初始化driver
driver = webdriver.Chrome()
# 请求网页
driver.get('https://www.baidu.com')
time.sleep(3)
# 关闭tab页面
# driver.close()
# 关闭浏览器
# driver.quit()
# 通过id定位
# btn = driver.find_element_by_id('su')
# 获取对象的属性
# value = btn.get_attribute('value')
# print(value)
# 通过class获取对象
# obj = driver.find_element_by_class_name('hot-refresh-text')
# 找对象的文本
# print(obj.text)
# 截图 整个页面
# driver.save_screenshot('baidu.png')
# 截图 某个特定对象
# btn = driver.find_element_by_id('su')
# btn.screenshot('btn.png')
# 通过name获取对象, name属性是针对 input 框中的 name 属性
# obj = driver.find_element_by_name('wd')
# print(obj.get_attribute('maxlength'))
# 通过 标签名称 获取对象
# obj = driver.find_element_by_tag_name('form')
# print(obj.get_attribute('id'))
# 通过xpath获取对象
# 在selenium中 xpath语法只能定位到这个对象,而不能定位到 文本值 和 属性值
# obj = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[4]')
# print(obj.text)
# 通过 css 选择器 获取对象
# obj = driver.find_element_by_css_selector('#su')
# print(obj.get_attribute('value'))
# 通过 标签名称 定位 相同标签的多个元素
# obj = driver.find_elements_by_tag_name('a')
# print(obj)