安装chromedriver.exe之前,确保与当前的chrome版本一致
代码中修改:参考链接
下载chromedriver.exe
替换python (也有可能需要替换chrome里面的):
'''
from selenium import webdriver
# browser = webdriver.Chrome() 测试打开浏览器
'''
selenium.元素定位(find_element_by) 八种定位元素的方式
通过id定位元素:find_element_by_id(“id_vaule”)
通过name定位元素:find_element_by_name(“name_vaule”)
通过tag_name定位元素:find_element_by_tag_name(“tag_name_vaule”)
通过class_name定位元素:find_element_by_class_name(“class_name”)
通过css定位元素:find_element_by_css_selector()
通过xpath定位元素:find_element_by_xpath(“xpath”)
通过link:find_element_by_link_text(“text_vaule”)
通过find_element_by_partial_link_text()
例子:百度首页面做个搜索selenium
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(2) #隐形等待
driver.get('https://www.baidu.com/')
sleep(1)
#以五种定位方式定位到百度首页的搜索输入框
# 这里就是右击你想查找的内容,点击检查,弹出对应的javascript文件内容,如下图所示
# kw_find = driver.find_element_by_id('kw')
kw_find = driver.find_element(By.ID, 'kw') # 利于封装
#kw_find= driver.find_element_by_class_name('s_ipt')
#kw_find= driver.find_element_by_name('wd')
#kw_find= driver.find_element(By.NAME,'wd')
#kw_find = driver.find_element_by_xpath('//*[@id="kw"]')
#kw_find = driver.find_element_by_css_selector('#kw') #id用#kw,class用.s_ipt ,与css的简写方式相同
#send_keys() 是selenium自带的方法,用来输入文本
kw_find.send_keys('selenium')
#使用id定位方式定位到搜索按钮
su_find = driver.find_element_by_id('su')
#click() 是selenium自带的方法,用来点击定位的元素
su_find.click()
sleep(1)
# driver.quit()
python unknown error: DevToolsActivePort file doesn’t exist 问题解决
chrome_options = Options()
chrome_options.add_argument(’–no-sandbox’) # “–no-sandbox”参数是让Chrome在root权限下跑
chrome_options.add_argument(’–disable-dev-shm-usage’)
chrome_options.add_argument(’–headless’) # “–headless”参数是不用打开图形界面
browser = webdriver.Chrome(chrome_options=chrome_options)
打开淘宝购物车的例子
# 打开淘宝购物车
browser = webdriver.Chrome()
browser.get("https://www.taobao.com") # 打开淘宝
browser.find_element_by_link_text("亲,请登录").click() # 找到亲,请登录四个字
time.sleep(10)
browser.get("https://cart.taobao.com/cart.htm") # 打开淘宝购物车,用链接来get
browser.find_element_by_id("J_SelectAll1").click() # 选择全部商品
time.sleep(10)
browser.find_element_by_link_text("结 算").click() # 结算下单
用百度首页的的其中一个hao123来练习 link_text和partial_link_text定位方式
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(2) #隐形等待
driver.get('https://www.baidu.com/')
sleep(1)
#定位hao123页面的超链接并点击
hao123_find = driver.find_element_by_link_text('hao123') #这个方法比较直接,即通过超文本链接上的文字信息来定位元素
# hao123_find = driver.find_element_by_link_text('地图') 找到地图的超链接并进行点击
# hao123_find = driver.find_element_by_partial_link_text('hao1') #这个方法是上一个方法的扩展。当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使用这个方法来通过部分链接文字进行匹配
hao123_find.click()
sleep(1)
driver.quit()
定义hao123的超链接并进行点击
这个方法比较直接,即通过超文本链接上的文字信息来定位元素
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
for img in driver.find_elements_by_tag_name("img"):
print(img.text)
print(img.size)
print(img.tag_name)
sleep(2)
driver.quit()
运行发现没有图片名称打印出来,说明百度首页,所有图片都没有给出text这个属性
获取多节点(注意:这里是elements)
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
lis = browser.find_elements_by_css_selector(".service-bd li") # 注意是elements多个s
print(lis) # 输出为列表
节点交互
selenium可以驱动浏览器来执行一些动作:
输入文字用send_keys()
清空文字用clear()
点击按钮用click()
from selenium import webdriverimport time
browser = webdriver.Chrome() # 测试打开浏览器
browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
"""
selenium可以驱动浏览器来执行一些动作:
输入文字用send_keys()
清空文字用clear()
点击按钮用click()
"""
input = browser.find_element_by_id("q")
input.send_keys("iPhone") #在搜索框输入iPhone
time.sleep(5)
input.clear() # 清空搜索框的文字
time.sleep(2)
input.send_keys("iPad") # 在搜索框输入iPad
time.sleep(5)
button = browser.find_element_by_class_name("btn-search") # 获取点击按钮
button.click() # 点击搜索
动作链
from selenium import webdriver
from selenium.webdriver import ActionChains # 引入动作链
browser = webdriver.Chrome()
url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame("iframeResult") # 切换到元素所在的frame[框架]
"""
可以传入id、name、index以及selenium的WebElement对象,index从0开始
"""
source = browser.find_element_by_css_selector("#draggable") # 找到被拖拽对象
target = browser.find_element_by_css_selector("#droppable") # 找到目标
actions = ActionChains(browser) # 声明actions对象
time.sleep(10) # 先展示两个界面,然后一个拖入另一个窗口
actions.drag_and_drop(source,target) # 拖拽元素的起点和终点
actions.perform() # 执行动作action.click_and_hold() # 点击且长按,更多方法查看官方文档
执行JavaScript代码
from selenium import webdriver
browser = webdriver.Chrome()
url = "https://www.zhihu.com/explore"
browser.get(url)
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 将进度条下拉到最底部
time.sleep(5)
browser.execute_script("alert('hello')") # 弹出alert提示窗,这里是自己编译的脚本
获取节点信息
#创建浏览器对象
driver = webdriver.Chrome()
#加载请求指定url地址
driver.get("https://www.baidu.com/")
#获取id属性值为zh-top-link-logo的节点(logo)
logo = driver.find_element_by_id("result_logo")
print('1')
print(logo) #输出节点对象
print('-----')
print(logo.get_attribute('class')) #节点的class属性值
#获取id属性值为zu-top-add-question节点(提问按钮)
input = driver.find_element_by_id("su")
print('2')
print(input.text) #获取节点间内容
print('3')
print(input.id) #获取id属性值
print(input.location) #节点在页面中的相对位置
print(input.tag_name) #节点标签名称
print(input.size) #获取节点的大小
#driver.close()
切换frame
from selenium import webdriver
browser = webdriver.Chrome()
url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
"""
网页中有一种节点叫做iframe,也就是子Frame,相当于页面的子页面,
他的结构和外部网页的结构完全一致。
selenium打开页面后,他默认是在父级Frame里面操作,
而此时如果页面中还有子Frame,他是不能获取到子Frame里面的节点的,
这时候就需要使用switch_to.frame()方法来切换Frame。
"""
browser.switch_to.frame("iframeResult")
logo = browser.find_elements_by_class_name("logo")
print(logo)
# [<selenium.webdriver.remote.webelement.WebElement (session="1ccb11403013c749ce9fceda50a00975", element="88e5924e-d655-44c3-a905-8af1947b9d86")>]
当前网页前进和后退
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.get("https://www.taobao.com")
browser.get("https://www.jd.com")
browser.back() # 后退
time.sleep(2)
browser.forward() # 前进
browser.close() # 关闭浏览器
# 连续访问三个页面
cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
cookies = browser.get_cookies() # 获取cookies
print(cookies)
browser.add_cookie({"name":"name", "domain":"www.zhihu.com", "value":"germey"})
browser.delete_all_cookies() # 删除所有cookie
选项卡的创建和来回切换
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.execute_script("window.open()") # 调用一个新的选项卡
print(browser.window_handles)
# ['CDwindow-7106D94FF002752ADF198B986343E31D', 'CDwindow-B669BA9559DBB78D8D6EC9C5AA699C40']
browser.switch_to.window(browser.window_handles[1]) # 切换到第二个选项卡
browser.get("https://www.taobao.com")
time.sleep(1)
browser.switch_to.window(browser.window_handles[0]) # 切换到第一个选项卡
browser.get("https://jd.com")
"""
1、打开百度网页
2、新开一个选项卡,调用execute_script()方法传入JavaScript语法window.open()
3、切换到新打开的选项卡,调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表,
要想切换选项卡只需要调用switch_to.window()方法,这里我们将第二个选项卡代号传入,
即跳转到第二个选项卡,在第二个选项卡里打开新页面https://www.taobao.com,然后切换回第一个选项卡打开jd页面
"""
异常处理
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
try:
browser.find_element_by_id("hello")
except Exception as e:
print(e) # 打印错误信息 Exception捕获所有错误信息赋给e
finally:
browser.close()
"""
在使用selenium的过程中,难免遇到一些异常,例如超时、节点未找到错误,
一旦出现此类错误,程序便不会在继续运行了,这里我们使用try except语句来捕获各种异常
"""
选项卡切换
import time
from selenium import webdriver
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
browser = webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',options=option) # 声明一个浏览器对象
# 设置chromedriver的启动参数,在启动之前,为chrome开启实验性功能参数excludeSwitches,她的值为['enable-automation']
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser.get("https://www.baidu.com") # 打开Chrome
input = browser.find_element_by_id("kw") # 通过id定位到input框
input.send_keys("爱奇艺") # 在输入框内输入python
browser.find_element_by_id("su").click()
time.sleep(3)
browser.find_element_by_xpath('//*[@id="1"]/h3').click()
time.sleep(10)
browser.switch_to.window(browser.window_handles[1]) # 切换到新打开的选项卡定位爱奇艺的搜索框
search = browser.find_element_by_xpath("//input[@class='search-box-input']").send_keys("青春有你")
time.sleep(5)
browser.close() # 关闭浏览器
无头浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建chrome参数对象
opt = Options()
# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
opt.add_argument('--headless')
# 创建chrome无界面对象
driver = webdriver.Chrome(options=opt)
driver.get("http://www.baidu.com")
print(driver.page_source)
参考链接:https://www.cnblogs.com/songzhixue/p/11270593.html
实践中遇到的问题
一、
用Selenium定位充满div class页面元素的方法,id、xpath都没用的抓狂情况下
1、如果想用class定位,而定位不成功,就是有多个重复的class值一样
2、如何看class值一样
在console里面输入document.getElementsByClassName('title').length
3、如果长度大于1,那么确实是多个一样,无法定位
继续输入document.getElementsByClassName('title')
出现用到class的地方
4、最后我们进行查找和点击
js = "document.getElementsByClassName('title')[2].click()