环境搭建
Windows环境下,Python版的Selenium的安装过程如下:
1)安装Python和PyCharm
2)安装Selenium
在线安装:命令行窗口输入命令
pip install selenium==3.14
离线安装:
下载地址:https://pypi.org/project/selenium/
cd 路径(有setup.py文件的目录)
python setup.py install
# 注意!安装两个包:urllib3+selenium
# urllib3 是一个收集了多个用到 URL 的模块的包
3)安装浏览器并禁用更新;
计算机---管理---服务---Google更新服务---"禁用"
4)获取浏览器对应的驱动,并将浏览器驱动存放的路径添加到系统环境变量path里;
5)写一个简单的Selenium脚本跑一下。
通用定位
from selenium import webdriver
from time import sleep
# 【启动浏览器】
browser = webdriver.Chrome()
sleep(2)
# 【打开页面】
browser.get("https://www.baidu.com")
sleep(2)
browser.maximize_window()
# 【1】id定位
# 根据元素的id名来定位,相对唯一,可能会动态变化。
a1 = browser.find_element_by_id("feed_news_list")
# 【2】name定位
# 根据元素的name属性值来定位,可能不唯一。
a2 = browser.find_elements_by_name('baidu-site-verification')
# 【3】tag name定位
# 根据元素的标签名来定位,一般不唯一。
a3 = browser.find_elements_by_tag_name("h1")
# 【4】class name
# 根据元素的class属性值来定位,可能不唯一,受js影响动态变化
a4 = browser.find_elements_by_class_name('sitelink icon-site')
# 【5】link定位
# 根据<a>网易</a>来定位
a5 = browser.find_element_by_link_text('网易').click()
# 【6】partial link定位
# # 根据<a>网易</a>来定位
a6 = browser.find_elements_by_partial_link_text('易')
# 【7.1】css id选择器------>#id名[属性="属性值"]
# 【7.2】css class选择器--->.class名[属性="属性值"]
browser.find_element_by_css_selector('.g-gc[href="http://www.ce.cn/"]').click()
# layout > ul:nth-child(39) > li:nth-child(2) > p
# CSS里标识层级关系使用的是 >
# 【7.3】css 元素选择器--->元素名[属性="属性值"]
browser.find_element_by_css_selector('a[data-title="豆瓣网"]').click()
# 【7.4】**名字当中有空格时**
# 如:class="pn ng" 可写为".pn.ng"
# 【8.1】Xpath 相对路径 //表示任意目录
browser.find_element_by_xpath('''//ul/li[10]/div/a[@data-title="网易云音乐"]''').click()
# 【8.2】Xpath 绝对路径 /html....[@属性名="属性值"]
# 【8.3】可以使用逻辑运算符来连接多个属性 and
# 【8.4】模糊属性值定位
# 比如:动态id【starts-with】、【ends-with】、【contains】
browser.find_element_by_xpath("//h1[starts-with(@id,'username_')]")
# 【关闭浏览器】
browser.quit()
注意
find_elements 匹配多个,返回一个列表,匹配0个,返回空列表
find_element 匹配到多个,只返回第一个,类型为webelement
特殊定位
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
browser = webdriver.Chrome()
browser.implicitly_wait(4)
# 【JS打开网页】 相当于浏览器顶部 " + "
js1 = 'window.open("https://www.baidu.com");'
browser.execute_script(js1);sleep(2)
js2 = 'window.open("https://www.csdn.net/");'
browser.execute_script(js2);sleep(2)
js3 = 'window.open("https://www.bilibili.com/");'
browser.execute_script(js3);sleep(2)
js4 = 'window.open("https://dict.youdao.com/?keyfrom=cidian");'
browser.execute_script(js4);sleep(2)
# 【切换窗口--for循环】
# browser.current_window_handle 获取当前窗口句柄
# browser.window_handles 获取所有的窗口句柄
# browser.switch_to.window(i) 切换到某个窗口
h1 = browser.current_window_handle
for i in browser.window_handles:
if i != h1:
browser.switch_to.window(i)
sleep(2)
# 【切换窗口--通过句柄编号切换】
handle_num = [0,4,3,2,1]#对应第1 2 3 4 5个网页
for i in handle_num:
browser.switch_to.window(browser.window_handles[i])
sleep(2)
# 【弹窗处理】----------------------------------------
browser.switch_to.alert.text() # 获取弹窗上的文本信息
browser.switch_to.alert.accept() # 接受弹窗
browser.switch_to.alert.dismiss() # 取消弹窗
# 【鼠标操作】----------------------------------------
element2 = browser.find_element_by_id("悬停的元素的id")
ActionChains(browser).move_to_element(element2).perform() # 鼠标悬停
ActionChains(browser).double_click(element2).perform() # 双击
ActionChains(browser).context_click(element2).perform() # 右击
# 【键盘操作】----------------------------------------
text1 = browser.find_element_by_id("文本框的id")
text1.send_keys("abc")
text1.send_keys(Keys.BACK_SPACE) # 退格
text1.send_keys(Keys.CONTROL, "a") # 全选
# 剪切("x") 粘贴("v")
# 【JS调用】----------------------------------------
browser.set_window_size(800, 600) # 产生滚动条
js_1 = "window.scrollTo(100,450);" # js代码
browser.execute_script(js_1) # 执行js代码
# 【窗口截图】----------------------------------------
browser.get_screenshot_as_file(r".\0101.png")
# 【获取元素标签中的文本】
# <div>要找的文本</div>
element1 = browser.find_element_tag_name("div")
element1.getAttribute("textContent")
# 【验证码处理】---------------------------------------
# 去掉验证码
# 设置万能验证码
# 购买验证码识别技术
# 手工输入
文本框
from selenium import webdriver
browser = webdriver.Chrome()
# 清空文本框内容
browser.find_element_by_id("scbar_txt").clear()
# 输入selenium
browser.find_element_by_id("scbar_txt").send_keys("selenium")
# 提交输入的内容
browser.find_element_by_id("scbar_txt").submit()
框架切换
<h3>frame</h3>
<iframe src="http://www.baidu.com" width="800" height="300">
</iframe>
from selenium import webdriver
browser = webdriver.Chrome()
# 定位到框架
element1 = browser.find_element_by_id("框架中某个元素的id")
browser.switch_to.frame(element1)
# 返回到主页面
browser.switch_to.default_content()
browser.quit()
下拉列表
<select name= education id=education>
<option value=1>高中</option>
<option value=2>大学</option>
<option value=3>博士</option>
</select>
from selenium.webdriver.support.select import Select
from selenium import webdriver
browser = webdriver.Chrome()
# 必须先要导入Select模块
element1 = browser.find_element_by_xpath('// *[ @ id = "education"]')
e = Select(element1)
e.select_by_visible_text("高中")
e.select_by_value("2")
e.select_by_index(0)
browser.quit()
等待方式
1.强制等待
import time
sleep(2)
2.隐式等待
# 只需要声明一次,页面所有元素都在规定时间内加载好,才执行下一步
from selenium import webdriver
implicitly_wait(10)
3.显式等待
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser=webdriver.Firefox()
sleep(2)
# 打开百度页面
browser.get("https://www.baidu.com/")
# 【只要某个元素在规定时间内加载好,就执行下一步】
e=WebDriverWait(browser,5,0.5).until(EC.presence_of_element_located((By.ID,'kw')))
e.send_keys("selenium")
sleep(2)
browser.quit()