selenium+python(基础)

中文版说明
英文版说明

功能展示

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time

browser = webdriver.Chrome() # 声明浏览器对象
try:
    browser.get('https://www.baidu.com') # 访问网页
    input = browser.find_element_by_id('kw') # 关键字ID
    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出现
    print(browser.current_url)  # 得到URL
    print("======"*10)
    print('cookies:',browser.get_cookies()) # 返回cookies
    print("======" * 10)
    print('page:',browser.page_source)# 返回网页代码

finally:
    browser.close()

声明浏览器

browser = webdriver.Chrome()

访问页面

from selenium import webdriver
browser = webdriver.Chrome()
url = 'http://www.baidu.com'
browser.get(url) # 访问页面
print(browser.page_source) #打印源代码
browser.close() # 关闭

查找节点

官网

单个节点

单个节点定位(8个)

1.通过ID定位元素
如果id不是动态的,一个页面的id是唯一的。最简单的定位方式;
注意点:有些id值是动态变化的,则不能使用该方法定位。如:id就是动态的,每次进入页面,该id都会改变。
browser.find_element_by_id()

2.通过name定位元素
name有可能会重复哦。
browser.find_element_by_name()

3.通过XPath定位元素※※※※※(非常有用
XPath是一种XML文档中定位元素的语言。该定位方式也是比较常用的定位方式。
find_element_by_xpath("//标签名[@属性=‘属性值’]")
browser.find_element_by_xpath()
使用:find_element_by_xpath(“XPath”)
实例:
3.1通过属性定位元素
find_element_by_xpath("//标签名[@属性=‘属性值’]")
id属性:
find_element_by_xpath("//input[@id=‘kw’]")
class属性:
find_element_by_xpath("//input[@class=‘s_ipt’]")
name属性:
find_element_by_xpath("//input[@name=‘wd’]")
maxlength属性:
find_element_by_xpath("//input[@maxlength=‘255’]")
3.2通过标签名定位元素
指所有input标签元素
find_element_by_xpath("//input")
3.3父子定位元素
查找有父亲元素的标签名为span,它的所有标签名叫input的子元素
find_element_by_xpath("//span/input")
3.4根据元素内容定位元素(非常实用)
find_element_by_xpath("//p[contains(text(),‘京公网’)]")

<p id="jgwab">
<i class="c-icon-jgwablogo"></i>
京公网安备11000002000001号
</p>

注:contains的另一种用法//input[contains(@class,‘s’)]说明class属性包含s的元素。

3.5组合定位元素
//父元素标签名/标签名的属性值:指的是span下的input标签下class属性为s_ipt的元素
find_element_by_xpath("//span/input[@class=‘s_ipt’]")
多个属性组合定位(挺常用的)
指的是input标签下id属性为kw且name属性为wd的元素
find_element_by_xpath("//input[@class=‘s_ipt’ and @name=‘wd’]")
指的是p标签下内容包含“京公网”且id属性为jgwab的元素
find_element_by_xpath("//p[contains(text(),‘京公网’) and @id=‘jgwab’]")

4.通过link文字精确定位元素
browser.find_element_by_link_text()
5.通过link文字模糊定位元素
browser.find_element_by_partial_link_text()

6.通过tag_name定位元素
标签名字最容易重复,不过,当定位一组数据时,可使用。
browser.find_element_by_tag_name()

7.通过class_name定位元素 classname有可能重复哦
browser.find_element_by_class_name()

8.CSS定位元素 ※※※※※(非常有用
CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML文档的表现。CSS可以较为灵活的选择控件的任意属性,一般情况下会比XPath快。且语法也比较简洁。不过CSS对于初学者而言比较复杂。
browser.find_element_by_css_selector()
8.1通过id属性定位元素
#号表示通过id属性来定位元素
find_element_by_css_selector("#kw")
8.2通过class属性定位元素
**.**号表示通过class属性来定位元素
find_element_by_css_selector(".s_ipt")
8.3通过标签名定位元素
find_element_by_css_selector(“input”)
8.4通过属性定位元素(挺常用的)
find_element_by_css_selector("[name=‘wd’]")
find_element_by_css_selector("[maxlength=‘255’]")

属性值包含某个值
属性值包含wd:适用于由空格分隔的属性值。
find_element_by_css_selector("[name~=‘wd’]")
8.5父子定位元素
查找有父亲元素的标签名为span,它的所有标签名叫input的子元素
find_element_by_css_selector(“span>input”)
8.6组合定位元素
标签名#id属性值:指的是该input标签下id属性为kw的元素
find_element_by_css_selector(“input#kw”)
标签名.class属性值:指的是该input标签下class属性为s_ipt的元素
find_element_by_css_selector(“input.s_ipt”)
标签名[属性=’属性值‘]:指的是该input标签下name属性为wd的元素
find_element_by_css_selector(“input[name=‘wd’]”)
父元素标签名>标签名.class属性值:指的是span下的input标签下class属性为s_ipt的元素
find_element_by_css_selector(“span>input.s_ipt”)
多个属性组合定位元素(挺常用的)
指的是input标签下id属性为kw且name属性为wd的元素
find_element_by_css_selector(“input.s_ipt[name=‘wd’]”)
指的是input标签下name属性为wd且maxlength为255的元素
find_element_by_css_selector(“input[name=‘wd’ ][maxlength=‘255’]”)
比较复杂的CSS定位可查看
http://www.360doc.com/content/13/1105/10/11675837_326750173.shtml
http://www.360doc.com/content/13/1105/10/11675837_326750240.shtml

9.通过By定位元素
from selenium.webdriver.common.by import By
定位的类型包括By.ID,By.NAME,By.CLASS_NAME,By.TAG_NAME,By.LINK_TEXT,By.PARTIAL_LINK_TEXT,By.XPATH,By.CSS_SELECTOR(对应的1~8)

#获取节点 baidu
from selenium import webdriver

chrome_options = webdriver.ChromeOptions() # 浏览器设置
chrome_options.add_argument('--headless') # 隐藏
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'http://www.baidu.com/'
browser.get(url)

"""
内容:
<span class="bg s_ipt_wr iptfocus quickdelete-wrap">
<span class="soutu-btn"></span>
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
<a href="javascript:;" id="quickdelete" title="清空" class="quickdelete" style="top: 0px; right: 0px; display: none;">
</a>
</span>
"""
# 单个节点定位(8个)
"""
#通过ID定位元素 如果id不是动态的,一个页面的id是唯一的。最简单的定位方式;
#注意点:有些id值是动态变化的,则不能使用该方法定位。如:id就是动态的,每次进入页面,该id都会改变。
browser.find_element_by_id() 
#通过name定位元素 name有可能会重复哦。 
browser.find_element_by_name() 
#通过XPath定位元素
#XPath是一种XML文档中定位元素的语言。该定位方式也是比较常用的定位方式。
find_element_by_xpath("//标签名[@属性='属性值']")
browser.find_element_by_xpath() 
#通过link文字精确定位元素
browser.find_element_by_link_text() 
#通过link文字模糊定位元素
browser.find_element_by_partial_link_text()
#通过tag_name定位元素
#标签名字最容易重复,不过,当定位一组数据时,可使用。
browser.find_element_by_tag_name()
#通过class_name定位元素 classname有可能重复哦
browser.find_element_by_class_name()
#CSS定位元素 
#CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML文档的表现。CSS可以较为灵活的选择控件的任意属性,一般情况下会比XPath快。且语法也比较简洁。不过CSS对于初学者而言比较复杂。
browser.find_element_by_css_selector() 
"""
input_1th = browser.find_element_by_id("kw")
input_2th = browser.find_element_by_name("wd")
input_3th = browser.find_element_by_xpath('//*[@id = "kw"]')
input_4th = browser.find_element_by_link_text('登录')
input_5th = browser.find_element_by_partial_link_text('登')
input_6th = browser.find_element_by_tag_name('input')
input_7th = browser.find_element_by_class_name('s_ipt')
input_8th = browser.find_element_by_css_selector('#kw')
print(input_1th,'\n',input_2th,'\n',input_3th,'\n',input_4th)
print('\n',input_5th,'\n',input_6th,'\n',input_7th,'\n',input_8th)
browser.close()

了解更多元素定位请点击

多个节点

browser.find_elements_by_id()
browser.find_elements_by_name()
browser.find_elements_by_xpath()
browser.find_elements_by_link_text()
browser.find_elements_by_partial_link_text()
browser.find_elements_by_tag_name()
browser.find_elements_by_class_name()
browser.find_elements_by_css_selector()

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.taobao.com'
browser.get(url)
lis = browser.find_elements_by_css_selector('.J_Service li')
for li in lis:
    print(li)
browser.close()

节点交互

#节点交互
from selenium import webdriver
import time
brower = webdriver.Chrome()
url = 'http://www.taobao.com/'
brower.get(url)
input = brower.find_element_by_css_selector('#q')
input.send_keys('iPhone')
time.sleep(2)
input.clear()
input.send_keys('iPad')
button = brower.find_element_by_css_selector('.btn-search')
button.click()#单击
time.sleep(2)
brower.close()

更多交互动作

动作链

# 动作链
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

browser = webdriver.Chrome() # 初始化浏览器
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url) # 访问网页
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector("#draggable") # 找节点(请拖拽我!)
target = browser.find_element_by_css_selector("#droppable") # 找节点(请放置到这里!)
actions = ActionChains(browser) # 声明ActionChains对象并将其赋值为actions变量
actions.drag_and_drop(source,target) # 按住源元素上的鼠标左键,然后移动到目标元素并释放鼠标按钮。
actions.perform() # 执行动作
time.sleep(3)
browser.close()

更多动作链

执行JavaScript

# 执行js
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)')# 下拉到底部
browser.execute_script('alert("To Bottom")')# 弹出alert 提示框

获取节点信息

在这里插入图片描述

#获取节点信息
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
brower = webdriver.Chrome(chrome_options=chrome_options)
brower.get('https://zhidao.baidu.com/')
input = brower.find_element_by_css_selector('#search-btn')
print(input) 
print(input.get_attribute('class')) #获取节点的class属性,结果为:btn-global
print(input.text) #获取节点的文本内容,结果为:搜索答案
print(input.id) #获取节点的ID,结果为:4b3bba2f-13fb-42a5-a6cd-4c08a20b0b5d
print(input.location) #获取节点的位置,结果为:{'x': 721, 'y': 65}
print(input.tag_name) #获取节点的标签名,结果为:button
print(input.size) #获取节点的大小,结果为:{'height': 40, 'width': 104}
brower.close()

结果:
<selenium.webdriver.remote.webelement.WebElement (session="c3f360dfaacd478d335e0234031d8a9d", element="4b3bba2f-13fb-42a5-a6cd-4c08a20b0b5d")>
btn-global
搜索答案
4b3bba2f-13fb-42a5-a6cd-4c08a20b0b5d
{'x': 721, 'y': 65}
button
{'height': 40, 'width': 104}

切换Frame

在这里插入图片描述

# 切换Frame
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')

browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.get_attribute('class'))
print(logo.text)

结果:
NO LOGO
<selenium.webdriver.remote.webelement.WebElement (session="4cfe913c0ccda9792a7f637a642d10ad", element="a625e330-847f-491d-94df-54e64dbb8f02")>
navbar-header logo
RUNOOB.COM

延时等待

官文
Selenium Webdriver提供两种类型的等待-隐式和显式。显式等待使WebDriver等待特定条件发生,然后再继续执行。隐式等待使WebDriver在尝试查找元素时轮询DOM一定时间(即设定一定的时间)

隐式等待

如果selenium没有在DOM中找到节点,将继续等待,超出设定时间后,抛出找不到节点的异常

#隐式等待
from selenium import webdriver

browser  = webdriver.Chrome()
browser.implicitly_wait(1)
browser.get('http://www.zhihu.com/explore')
input = browser.find_elements_by_css_selector('.LoadingBar')
# LoadingBar 有
# zu-top-add-question 无此class_name
print(input)
browser.close()

显式等待

显式等待是您定义的代码,用于在继续执行代码之前先等待特定条件发生。极端的情况是time.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法,可以帮助您编写仅等待所需时间的代码。WebDriverWait与ExpectedCondition结合是实现此目的的一种方法。

#显式等待
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('http://www.taobao.com/')
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input)
print(button)
browser.close()

前进和后退

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://baidu.com/')
browser.get('https://taobao.com/')
browser.get('https://python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

Cookies

#Cookies 操作
from selenium import webdriver
browser = webdriver.Chrome()
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())
browser.delete_all_cookies() # 删除cookies
print(browser.get_cookies())

选项卡管理

# 选项卡管理
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.execute_script('window.open()') # 调用execute_script方法执行JavaScript语句 打开新的选项页
print(browser.window_handles) # 打印选项卡ID
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') # 对选中页加载网页
time.sleep(20)

异常处理

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,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 as e:
    print('not element')
finally:
    browser.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值