selenium

selenium

 

复制代码
selenium之ChromeDriver与版本下载 https://blog.csdn.net/u012991166/article/details/80490681
ChromeDriver下载地址: http://chromedriver.storage.googleapis.com/index.html
下载好后解压出exe文件,放入环境变量保存的路径下即可,即python文件夹下,或者python/script文件夹下即可

一次简单的、完整的基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()#返回一个浏览器驱动对象
try:
    browser.get('https://www.baidu.com') #访问url
    input = browser.find_element_by_id('kw') # 返回id=kw的标签
    input.send_keys('Python') # 往标签里传入信息
    input.send_keys(Keys.ENTER)# 键入回车键
    wait = WebDriverWait(browser, 10)# 等待10秒
    wait.until(EC.presence_of_element_located((By.ID, 'content_left'))) #等待id= content_left 的内容加载完毕
    print(browser.current_url) #输入browser的当前url
    print(browser.get_cookies()) # 输出返回的cookies
    print(browser.page_source) # 打印源代码
finally:
    browser.close()
selenium模块安装、简单示例
复制代码

chromedriver各个版本的下载地址是: 

https://npm.taobao.org/mirrors/chromedriver/

复制代码
声明浏览器对象
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
声明浏览器对象
复制代码

 

复制代码
获取单个元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')   #查找并返回id=q的标签
input_second = browser.find_element_by_css_selector('#q')#查找并返回id=q的标签
input_third = browser.find_element_by_xpath('//*[@id="q"]')#查找并返回id=q的标签

input_first = browser.find_element(By.ID, 'q')#另一种,比较通用的查找方式

其他类似的方法
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector


获取多个元素
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')#方法的区别就是element多了个s;返回的是一个列表
lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')  # 自然也有另一种方式

其他类似的方法
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
查找元素
复制代码
复制代码
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')    #访问url
input = browser.find_element_by_id('q')  #通过id=q获取input框
input.send_keys('iPhone') #在input框中输入iphone
time.sleep(1)
input.clear()   #清除了input框的内容
input.send_keys('iPad') # 在input框中输入了ipad
button = browser.find_element_by_class_name('btn-search') # 获取了搜索按钮
button.click() 点击搜索按钮

更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement


交互动作
将动作附加到动作链中串行执行
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')    # 应该是把当前的doc切换到了内部的id=iframeResult的iframe中
source = browser.find_element_by_css_selector('#draggable') #通过css选择器找到#draggable
target = browser.find_element_by_css_selector('#droppable') #通过css选择器找到#droppable
actions = ActionChains(browser) #声明了一个动作链对象
actions.drag_and_drop(source, target) #执行拖拽动作
actions.perform()

更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains



执行JavaScript
在做元素交互时,可能有些操作没有提供api,比如现在想要实现进度条下拉的动作,直接用selenium api实现是很有难度的
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') # 就是执行JavaScript API;这是比较万能的办法
browser.execute_script('alert("To Bottom")')
元素交互操作
复制代码
复制代码
.get_attribute('class')#查看该对象的class属性
.text#查看该对象的文本值
获取ID、位置、标签名、大小
.id
.location
.tag_name
.size
获取元素信息
复制代码

 

复制代码
-------------------------------------------------------Frame--------------------------------------------------------

Frame   iframe就是主页面里面包含了一个子页面,是完全独立的;想要查找frame中的元素,browser必须切换到frame中才能查找

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult') #切换到id=iframeResult的iframe中
source = browser.find_element_by_css_selector('#draggable') #获取元素对象
print(source)
try:
    logo = browser.find_element_by_class_name('logo') #这个logo实际是在父frame中,就是在该iframe外面
except NoSuchElementException:#捕捉错误:没有查找到该元素
    print('NO LOGO')
browser.switch_to.parent_frame()#切换到父frame
logo = browser.find_element_by_class_name('logo')  #查找成功
print(logo)
print(logo.text)   

-----------------------------------------选项卡管理(浏览器多窗口)---------------------------------------------
切换handle

browser = webdriver.Chrome()
browser.get('https://www.baidu.com') 
browser.execute_script('window.open()') #其实就是执行javascript语句,打开一个新的选项卡
# chrome浏览器是有设置快捷键打开新选项卡,所以当然也可以使用这种方式;上面的方式更加万能
print(browser.window_handles)#可以看到是一个list,里面包含了2个对象:['CDwindow-90F7B5B7CA3830BA23B39FB1BDD120DF', 'CDwindow-961FFA7CF284E748BE76CEB23ACE094A']
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://python.org')


-----------------------------------------切入弹窗-----------------------------------------
切入:driver.switch_to_alert()

切出/回到原始页面
使用与上面三种方法:self.driver.switch_to.default_content() #返回原始driver

页面的刷新
我只是觉得很可能很多人不知道这个:driver.refresh()
切换Frame、handle、弹窗
复制代码

 

复制代码
有时可以用time.sleep这种简单粗暴的方式

隐式等待,默认的时间是0
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0

browser = webdriver.Chrome()
browser.implicitly_wait(10)#执行selenium时,可能某些ajax请求还未加载完毕,所以需要手动设置等待时间。 #设置隐式等待时间10秒,
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')若浏览器成功加载,已找到目标对象,则不会等待着10秒
print(input) #selenium返回的元素对象类型为selenium.webdriver.remote.webelement.WebElement
<selenium.webdriver.remote.webelement.WebElement (session="b29214772d59e912f1ac52e96ed29abe", element="0.12886805191194894-1")>


(看起来隐式等待只能设置时间,而显式等待不止可以设置等待时间,还可以设置各种判断条件)
显式等待(更常用)

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
​
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)  #猜测应该是返回了一个WebDriverWait对象,指定了显示等待时间10秒
input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) # 最长等待10秒,尝试获取元素对象;若失败,则抛出异常
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

显示等待条件
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert
详细内容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
隐式等待、显式等待
复制代码
复制代码
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()#返回上一个访问的页面
time.sleep(1)
browser.forward()# 前进
browser.close() # 关闭浏览器
前进、后退
复制代码

 

 

复制代码
#-----------------------PhantomJS设置代理-------------------------------------
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

proxy = Proxy(
    {
    'proxyType': ProxyType.MANUAL,
    'httpProxy': 'ip:port'  # 代理ip和端口
    }
)
# 配置对象DesiredCapabilities
desired_capabilities = DesiredCapabilities.PHANTOMJS.copy()
# 把代理ip加入配置对象
proxy.add_to_capabilities(desired_capabilities)
driver = webdriver.PhantomJS(
executable_path="/path/of/phantomjs",
desired_capabilities=desired_capabilities
)
driver.get('http://www.ip.cn/')


#---------------------------Firefox设置代理------------------------------------------------
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.http', '127.0.0.1')
profile.set_preference('network.proxy.http_port', 17890)  #端口号为int
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)
driver.get('http://www.ip.cn/')

#---------------------------Chrome设置代理------------------------------------------------
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--proxy-server=http://ip:port')  
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get('http://www.ip.cn/')
设置代理
复制代码

 

复制代码
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies()) #应该是获取响应头里包含的cookies
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) #设置cookies
print(browser.get_cookies()) #看起来不是响应头里包含的cookies,而是有关这个url的所有的cookies
browser.delete_all_cookies() #清空cookies
print(browser.get_cookies())
cookies
复制代码
复制代码
from selenium import webdriver
​
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')  #NoSuchElementException  


browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()
    

详细文档:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
异常处理
复制代码

 

 

复制代码
from selenium import webdriver

opt = webdriver.ChromeOptions()# 创建chrome参数对象
opt.set_headless()# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
driver = webdriver.Chrome(options=opt)# 创建chrome无界面对象
driver.get('https://baidu.com/')# 访问百度
print(driver.page_source)#打印内容



-----------------2种chromedriver无界面方式,推荐使用第二种---------------------

#selenium:3.12.0
#webdriver:2.38
#chrome.exe: 65.0.3325.181(正式版本) (32 位)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()

chrome_options.add_argument('--no-sandbox')#解决DevToolsActivePort文件不存在的报错

chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手动指定使用的浏览器位置

driver=webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.baidu.com')

print('hao123' in driver.page_source)

driver.close() #切记关闭浏览器,回收资源
chromedriver无界面方式
复制代码

 

 

复制代码
webdriver有时要切iframe,否则会找不到目标元素


phantomjs:不要选!不要选这个!phantomjs相信是很多爬虫使用者在接触selenium时使用的的一个浏览器了。无头(无界面)浏览器。但是,phantomjs已经放弃维护了,使用中会出现进程无法正常关闭的情况,只能通过系统脚本kill,还有一个问题可以说非常致命了,在driver异常的时候不仅无法正常退出还可能将cpu占满,很可能导致你其他进程的执行失败。不推荐,真的不推荐。

firefox:没有phantomjs那两个问题,用起来相对正常(有种说法是selenium对firefox支持最好)。缺点在于没有无界面模式(也许有,但我翻了很多文档都没找到);在程序异常是会输出大量日志文件挤占磁盘空间(win下默认输出在c:\windows\temp\)。这两个缺点相对比较好克服,第一点,反正你一般也不会在你的爬虫集群上面的机器进行操作所以影响不大;第二点,写个脚本让磁盘空间不足的时候自动删除这个目录就好了。

Chrome:我现在使用的是这个。有无界面模式,缺点除了占点内存也没什么(内存占用并没有很夸张,比phantomjs多1/3不到的样子)。希望谷歌爸爸的Chrome就这样坚持下去不要出问题。







time.sleep:不是selenium的等待方式,但有时候简单粗暴出奇迹(原因看下面)。
implicitly_wait(xx):隐性等待。设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止。
WebDriverWait类:显式等待,配合until()和until_not()方法。程序每隔x秒看一下,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
最长的等待时间取决于两者之间的大者,如果隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。
网上说implicit_wait、WebDriverWait存在风险会遇见bug,我在使用时是没遇见网上说法的运行错误的bug,但是在使用显式等待时的确会遇见失效的现象,所以time.sleep出奇迹。
一些坑。。。
复制代码

 

 

 


参考:https://www.cnblogs.com/zhaof/p/6953241.html
https://cuiqingcai.com/2599.html

posted @   雲淡風輕333  阅读(199)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示