Fork me on GitHub

python selenium的基本使用

在比夜更深的地方,一定有比夜更黑的眼睛!

安装

pip安装selenium:

1
pip install selenium

安装对应的驱动点这里(下面将使用chrome为例,使用的是chromedriver,注意浏览器版本和driver要对应,不然使用是会出错)

基本使用

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By # 选择器,ID,CSS,XPATH等
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()
wait = WebDriverWait(browser,10)

try:
browser.get('https://www.baidu.com')
inputs = browser.find_element_by_id('kw')
inputs.send_keys('Python')
inputs.send_keys(Keys.ENTER)

wait.until(EC.presence_of_element_located((By.ID,'content_left')))

print(browser.current_url)
print(browser.get_cookies)

with open('D:/Desktop/test.html','w',encoding='utf8') as f:
f.write(browser.page_source)
except Exception as e:
print(e.args)
finally:
browser.quit()

申明浏览器对象

1
2
3
4
5
6
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.Phatomjs()

访问页面

1
2
browser.get('http://www.baidu.com)
print(browser.page_source)

查找元素

单个元素:

1
2
3
4
5
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_css_selector('#q')
input_thrid = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first,input_second,input_thrid)
browser.close()

也可以:

1
2
3
from selenium.wendriver.commom.by import By

input_first = browser.find_element(By.ID,'q')

多个元素:

1
2
lis = browser.find_elements_by_CSS_selector('.service-db li')
lis1 = browser.find_elements(By.CSS_SELECTOR,'.service-db li')

其他方法:

1
2
3
4
5
6
7
find_elements_by_name()
find_elements_by_link_text()
find_elements_by_partail_link_text()
find_elements_by_tag_name()
find_elements_by_class_name()
find_elements_by_css_selector()
find_elements_by_xpath()

元素交互操作(对获取到的按钮、文本框操作):

1
2
3
4
5
6
7
input = browser.find_element_by_id('q')
input_send_keys('iPhone')
time.slepp(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()

交互动作(将动作附加到动作链中串行执行):

演示拖拽:

1
2
3
4
5
6
7
8
from selenium.wendriver import ActionChains

source = browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source,target)
actions.perform()

ActionChains方法列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
click(on_element=None) ——单击鼠标左键 
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少 距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

执行JavaScript(某些动作比较难实现的时候,可以用Javascript实现):

1
2
3
4
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('windows.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert('To bottom')')

获取属性、文本值、ID、位置、大小等:

获取属性:

1
2
3
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attrbute('class'))

获取文本值:

1
print(logo.text)

获取ID、位置、标签名、大小:

1
2
3
4
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)

Frame

1
2
3
from selenium.common.exceptions import NoSuchElementException

browser.switch_to.frame('iframeResult')

等待

隐式测试

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

1
2
3
4
5
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
inputs = browser.find_element_by_class_name('zu-top-add-question') # 如果没找到,则等待,10秒内还没找到,就抛出异常
print(inputs)

显示等待:

1
2
3
4
5
6
7
8
9
10
from selenium.wendriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser.get('https://www.taobao.com')
wait = WebDriverWait(browser,10)

inputs = wai.until(EC.presence_of_element_locate(By.ID,'q'))
button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,'.btn-search'))
print(inputs,button)

显示等待的一些条件:

  • title_is 标题是某内容
  • title_contains 标题包含某内容
  • presence_of_element_located 元素加载出,传入定位元组,如(By.ID,’q’)
  • visibility_of_element_located 元素可见,传入定位元组
  • visiblity_of 可见,传入元素对象
  • presence_of_all_elements_located 所有元素加载出
  • text_to_be_present_in_element 某个元素文本包含某文字
    …还有很多,可参看文档

ccookies

1
2
browser.get_cookies()
browser.add_cookies({'xxx':'xxx','xxx':'xxx'})

选项卡管理(打开窗口、切换窗口)

1
2
3
browser.execute_script('windows.open()')
print(browser.windows_handles)
browser.switch_to_window(browser.windows_hangles[1])

异常处理

1
from selenium.common.exceptions import TimeoutException,NoSuchElementException

无界面:

需要chrome需要60版本以上

1
2
3
4
5
6
7
8
9
10
11
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options=Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

web=webdriver.Chrome(chrome_options=options)
web.get('[http://www.kandianbao.com/'](http://www.kandianbao.com/');)
print(web.page_source)
web.quit()

selenium动态定位id、class

  1. 根据其他属性定位
    如果有其他固定属性,最先考虑的当然是根据元素的其他属性来定位,定位方式那么多,何必在这一棵树上吊死。。
  2. 根据相对关系定位
    根据其附近的父节点、子节点、兄弟节点定位,关于这方面,可参考:Python selenium —— 父子、兄弟、相邻节点定位方式详解
  3. 根据DOM顺序index定位
    这个很简单,找到该元素在主文档或某级父节点中的index,然后根据index可轻松定位,不过这种方式可能不够稳定,如果可以,还是用其他的方法定位更加合适。
  4. 根据部分元素属性定位
    xpath中提供了三个非常好的方法来为我们定位部分属性值:

    1
    2
    3
    4
    5
    6
    driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]")
    driver.find_element_by_xpath("//div[starts-with(@id, 'btn-attention')]")
    driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]") # 这个需要结尾是'btn-attention'
    contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
    starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
    ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false

    这里要多嘴一句,各种浏览器对xpath的支持情况不一样,像IE就差点,所以有时候会出现xpath在一个浏览器能定位到但在另一个浏览器定位不到的问题,不要惊讶。。

    附上一个此类型问题:

    Xpath “ends-with” does not work

参考

-------------本文结束感谢您的阅读-------------

本文标题:python selenium的基本使用

文章作者:Longofo

发布时间:2018年04月02日 - 23:04

最后更新:2018年04月26日 - 23:04

原始链接:http://longofo.cc/python selenium的基本使用.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请我吃包辣条也好啊!!!
分享到: