1.pycharm安装selenium(File-Settings-Project:PythonWorkSpace-Project Interpreter)
2.查看浏览器版本号
3.下载对应浏览器版本号的驱动
4.将下载的驱动放到pycharm项目下
5.测试是否成功
from selenium import webdriver
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
自动运行成功
web端进行定位的八种定位方式
单个元素定位
多个element
id
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
#通过 id 方式进行定位
input = db.find_element_by_id("kw")
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click() #点击
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
name
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
# 通过 name 方式进行定位
input = db.find_element_by_name("wd")
#对输入框的操作
input.send_keys("黑洞")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
class name
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
# 通过 class name 方式进行定位
input = db.find_element_by_class_name("s_ipt")
#对输入框的操作
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
by_xpath
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
# 通过xpath方式进行定位
input =db.find_element_by_xpath("//*[@id='kw']")
#对输入框的操作
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
CSS
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
# by_css 通过CSS选择器方式进行定位:id class 标签(加标签就可以定位)
input =db.find_element_by_css_selector("#kw")
#对输入框的操作
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
超链接定位
两种定位方式,也就是对应html页面中<a>
标签,括号里传的值就是a标签中的超链接文字,两者的区别在于一个是完整的超链接文字,一个是可以只写部分超链接文字
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
# 定位“百度一下”按钮的元素
xw = db.find_element_by_link_text("新闻")
xw.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
自动模糊匹配超链接文字
头标签开始,最先识别到哪个超链接文字就运行哪个
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
#自动模糊匹配超链接文字
xw = db.find_element_by_partial_link_text("新")
xw.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
tag _ name
返回:符合条件的第一个标签
可见仅仅通过标签名取定位时,一般一种标签在一个页面里面会出现不止依次甚至大量出现,这种定位方式作用不是很大,所以用的也比较少
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
# db.maximize_window() # 调整页面到最大
input =db.find_element_by_tag_name("input")
#对输入框的操作
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
# time.sleep(3) # 延时3秒
# db.quit() # 关闭浏览器
悬浮定位
from selenium.webdriver.common.action_chains import ActionChains
element = db.find_element_by_css_selector("#cata-nav > div:nth-child(1) > div.item-left > h3 > div > a")
# 悬浮在手机数码元素上
ActionChains(db).move_to_element(element).perform()
# 点击合约机
db.find_element_by_link_text('合约机').click()
time.sleep(3)
#打开百度---更多产品---音乐(悬浮下拉菜单定位)
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
element = driver.find_element_by_link_text('更多产品')
ActionChains(driver).move_to_element(element).perform()
driver.find_element_by_link_text('音乐').click()
time.sleep(3)
driver.quit()
#-*-coding:utf-8-*-
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains#引入函数模块
from selenium.webdriver.support.select import Select#引入函数模块
swk = webdriver.Chrome()
swk.maximize_window()
swk.get("https://www.baidu.com")
zbj = swk.find_element_by_link_text('设置')#先定位到顶级菜单
ActionChains(swk).move_to_element(zbj).perform()#再将鼠标移动到菜单上面
swk.find_element_by_link_text('搜索设置').click()#最后定位菜单元素并点击
time.sleep(3)
swk.find_element_by_id("s1_2").click()#单选框定位
swk.find_element_by_id('SL_1').click()#单选框定位
Select(swk.find_element_by_id('nr')).select_by_value("20")#select下拉菜单定位
Select(swk.find_element_by_id('issw1')).select_by_value('2')#select下拉菜单单定位
swk.find_element_by_id('sh_1').click()
swk.find_element_by_link_text('保存设置').click()
swk.switch_to.alert.accept()#alert弹出框"确认"
from selenium import webdriver
import time
db = webdriver.Chrome()
db.get("https://www.baidu.com/")
db.maximize_window() # 调整页面到最大
#-----八大元素定位--------
#1--(单个元素定位)
#input = db.find_element_by_id("kw") # 2--(id)
# input = db.find_element_by_name("wd") #3--(name)
# input = db.find_element_by_class_name("s_ipt") #4--(class name)
# input =db.find_element_by_xpath("//*[@id='kw']") #5--(xpath)
# input =db.find_element_by_css_selector("#kw") #6--(css)
input =db.find_element_by_tag_name("input") #7--(input)
# xw = db.find_element_by_link_text("新闻") #8--(超链接)
# xw = db.find_element_by_partial_link_text("新")
# xw.click()
#对输入框的操作
input.send_keys("纪昀")
# 定位“百度一下”按钮的元素
btn = db.find_element_by_id("su")
btn.click()
time.sleep(3) # 延时3秒
db.quit() # 关闭浏览器
显式等待
element=WebDriverWait(driver,timeout, poll_frequency=0.5,ignored_exceptions=None).until(
EC.presence_of_element_located((By.ID, "kw"))
)
driver #浏览器驱动
timeout #最长超时时间 默认以秒为单位
poll_frequency=0.5 #步长
ignored_exceptions # 超时后的异常信息 默认抛noSuchElementException
EC.presence_of_element_located((By.ID, "kw")) #判断元素是否被加载在dom树中,不代表他一定可见。
隐式等待
含义:通过一定时长等待,如果超出设置的时长元素还没有被加载,抛出NosuchException.
# 设置隐式等待为 10 秒
driver.implicitly_wait(10)
sleep休眠方法
Time.sleep(1)
Selenium显示等待和隐式等待的区别
1、selenium的显示等待
原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
(简而言之,就是直到元素出现才去操作,如果超时则报异常)
2、selenium的隐式等待
原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素为止。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部不断的刷新页面去寻找我们需要的元素
3、笨方法等待(死等)
使当前线程进入等待,time.sleep();这种等待属于死等,很容易让线程挂掉,使程序抛异常,所以要慎用此方法
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
#进入谷歌浏览器
db = webdriver.Chrome()
#进入百度
db.get("https://www.baidu.com/")
#窗口最大化
db.maximize_window()
#定位到设置超链接
emp = db.find_element_by_id("s-usersetting-top")
#点击设置
emp.click()
#点击”搜索设置“
db.find_element_by_link_text("搜索设置").click()
time.sleep(1)
#输出元素集中的内容
list = db.find_elements_by_class_name("item-setting")
print(list)
for i in list:
# print(i.text)
if i.text == "仅简体中文":
i.click()
#切换浏览器窗口
# db.switch_to_window() #选择窗口
# db.switch_to_alert() #对话框操作
# db.switch_to_frame() # <frame> 切换不同table页
# 句柄 浏览器唯一id # db.window_handles
xw = db.find_element_by_link_text("新闻")
# print("第一个页面的浏览器标识符",db.window_handles)
xw.click()
# print("第二个页面的浏览器标识符",db.window_handles)
# 输出第二个浏览器页面标识符
list = db.window_handles
print(list[1])
#print(db.title) #返回页面标题
浏览器基本操作
driver = webdriver.Firefox() # 选择浏览器:
driver.get(self.base_url + " www.baidu.com") #打开url:
driver.forward()/driver.back() #前进/后退:
driver.refresh() # 刷新
browser.maximize_window() # 最大化
print(driver.title) # 返回当前页面标题
print(driver.current_url) # 返回当前页面url
driver.window_handles # 返回当前浏览器的所有窗口
driver.current_window_handle # 返回当前浏览器的窗口句柄
driver.switch_to_window(“window_name”) # 选择窗口
driver.switch_to_alert() # 对话框操作
driver.quit()/driver.close() # 关闭浏览器:
键盘事件
* send_keys(Keys.BACK_SPACE) 删除键
* send_keys(Keys.SPACE) 空格键(Space)
* send_keys(Keys.TAB) 制表键(Tab)
* send_keys(Keys.ESCAPE) 回退键(Esc)
* send_keys(Keys.ENTER) 回车键(Enter)
* 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)
* send_keys(Keys.F1) 键盘 F1
……
* send_keys(Keys.F12) 键盘 F12
elements复数定位
复数定位方式每次取到的都是具有相同类型属性的一组元素,所以返回的是一个list队列,我们也可以利用这个去定位单个的元素。比如百度首页种,右上角有新闻、视频、地图、贴吧等一些链接,我们通过f12查看源码可以发现,这些链接都有共同的class, class=“mnav”。定位排在第六个的学术,可以这样定位:driver.find_elements_by_class_name(“mnav”)[5].click()
-
当页面元素有id属性时,最好尽量用id来定位。但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法。
-
xpath很强悍,但定位性能不是很好,所以还是尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
-
当要定位一组元素相同元素时,可以考虑用tagName或name。
-
当有链接需要定位时,可以考虑linkText或partialLinkText方式。
二次定位
1.定位 select 里的选项有多种方式,这里先介绍一种简单的方法:二次定位
2.基本思路,先定位 select 框,再定位 select 里的选项
s = driver.find_element_by_id("nr")
s.find_element_by_xpath("//option[@value='50']").click()
# 二次定位另外一种写法
driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click()