Python-Selenium使用记录
本文最后更新于 677 天前

(一) 启动浏览器

1. 普通启动方式

#!/usr/bin/python3
# encoding:utf-8
from selenium  import webdriver

#启动Firefox浏览器
#browser = webdriver.Firefox()
#启动IE浏览器
#browser = webdriver.Ie()
#启动Chrome浏览器
#指定驱动方式启动:webdriver.Chrome(executable_path="D://chromedriver.exe")
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")

2. Headless启动方式

浏览器的无界面形态,无需打开浏览器即可运行,此种方式只chrome60+版本

#!/usr/bin/python3
# encoding:utf-8
from selenium import webdriver

chrome_hless = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
chrome_hless.add_argument('--headless') 
chrome_hless.add_argument('--disable-gpu') 

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_hless)
mainUrl = "https://www.baidu.com/"
browser.get(mainUrl)
print(browser.title)
browser.quit()

(二) 元素定位

新版的定位,将条件选择作为参数了。如:
find_element_by_id => find_element(By.ID,”xxx”)
xpath定位可以结合浏览器 xpath扩展

元素 定位方式
id find_element_by_id()
name find_element_by_name()
class find_element_by_class_name()
link_text find_element_by_link_text(“全部文字匹配”)
partial_link_text find_element_by_partial_link_text(“部分文字匹配”)
tag find_element_by_tag_name()
xpath find_element_by_xpath()
css find_element_by_css_selector()

(三) selenium三种等待方式

1. 强制等待

from selenium import webdriver
import time
time.sleep(3)

2. 隐性等待

# 浏览器加载完成,即进行下一步操作,如果10秒钟还未加载完成,也进行下一步操作
driver.implicitly_wait(10) 

3. 显性等待

selenium.webdriver.support.wait.WebDriverWait

driver: 传入WebDriver实例,即我们上例中的driver
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

until

method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

until_not

与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。

WebDriverWait 常用方法表

对象 动作
title_is 判断当前页面的title是否完全匹配
title_contains 判断当前页面的title是否包含预期字符串
presence_of_element_located 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located 判断某个元素是否可见.可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是’column-md-3’,那么只要有1个元素存在,这个方法就返回True
text_to_be_present_in_element 判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value 判断某个元素中的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located 判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of 等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected 判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present 判断页面上是否存在alert

实例:

#coding=utf-8
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

base_url = "http://www.baidu.com"
driver = webdriver.Chrome()
driver.implicitly_wait(5)
'''隐式等待和显示等待都存在时,超时时间取二者中最大的'''
locator = (By.ID,'kw')
driver.get(base_url)

'''判断title是否存在,返回布尔值'''
WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
if WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道")) :
    print("已找到标题百度一下,你就知道")
WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))

'''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''
srk = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
#百度输入框,输入selenim
srk.send_keys("selenim")

'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))

'''判断元素是否可见,如果可见就返回这个元素WebElement'''
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))

'''判断是否至少有1个元素存在于dom树中,如果定位到就返回WebElement列表'''
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))

'''判断是否至少有一个元素在页面中可见,如果定位到就返回WebElement列表'''
WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))

'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))

'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))

'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
#注意这里并没有一个frame可以切换进去

'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
#注意#swfEveryCookieWrap在此页面中是一个隐藏的元素

'''判断某个元素中是否可见并且是enable的,代表可点击'''
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
'''等待某个元素从dom树中移除'''
#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()
#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
#这里没有找到合适的例子

'''判断某个元素是否被选中了,一般用在下拉列表'''
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))

'''判断某个元素的选中状态是否符合预期'''
WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))

'''判断某个元素的选中状态是否符合预期'''
WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()

'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
instance = WebDriverWait(driver,10).until(EC.alert_is_present())
print(instance.text)
instance.accept()

driver.close()

(四) 浏览器操作

1. 将浏览器最大化显示

browser.maximize_window()

2. 将浏览器最小化显示

browser.minimize_window()

3. 设置浏览器宽1366、高768显示

browser.set_window_size(1366, 768)

4. 浏览器前进、后退、退出、关闭

browser.forword()#前进
browser.back()#后退
browser.quit()#退出
browser.close()#关闭

(五) 操作元素对象

对象 动作
clear() 清空
send_keys() 键盘操作
click() 点击
submit() 提交
text 获取对象文本
get_attribute() 获取对象属性值

(六) 键盘事件

对象 动作
send_keys(Keys.TAB) TAB
send_keys(Keys.ENTER) 回车 |
send_keys(Keys.F12) F12
send_keys(Keys.CONTROL,’a’) ctrl+a

(七) 鼠标事件

对象 动作
click 单击
context_click() | 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
click_and_hold 按下鼠标左键在一个元素上

(八) 多层框架/层级定位

#先找到到 ifrome1(id = from1)
browser.switch_to_frame("from1")

(九) Selenium速查表

异常 描述
WebDriverException 所有webdriver异常的基类,当有异常且不属于下列异常时抛出
InvalidSwitchToTargetException 下面两个异常的父类,当要switch的目标不存在时抛出
NoSuchFrameException 当你想要用switch_to.frame()切入某个不存在的frame时抛出
NoSuchWindowException 当你想要用switch_to.window()切入某个不存在的window时抛出
NoSuchElementException 元素不存在,一般由find_element与find_elements抛出
NoSuchAttributeException 一般你获取不存在的元素属性时抛出,要注意有些属性在不同浏览器里是有不同的属性名的
StaleElementReferenceException 指定的元素过时了,不在现在的DOM树里了,可能是被删除了或者是页面或iframe刷新了
UnexpectedAlertPresentException 出现了意料之外的alert,阻碍了指令的执行时抛出
NoAlertPresentException 你想要获取alert,但实际没有alert出现时抛出
InvalidElementStateException 下面两个异常的父类,当元素状态不能进行想要的操作时抛出
ElementNotVisibleException 元素存在,但是不可见,不可以与之交互
ElementNotSelectableException 当你想要选择一个不可被选择的元素时抛出
InvalidSelectorException 一般当你xpath语法错误的时候抛出这个错
InvalidCookieDomainException 当你想要在非当前url的域里添加cookie时抛出
UnableToSetCookieException 当driver无法添加一个cookie时抛出
TimeoutException 当一个指令在足够的时间内没有完成时抛出
MoveTargetOutOfBoundsException actions的move操作时抛出,将目标移动出了window之外
UnexpectedTagNameException 获取到的元素标签不符合要求时抛出,比如实例化Select,你传入了非select标签的元素时
ImeNotAvailableException 输入法不支持的时候抛出,这里两个异常不常见,ime引擎据说是仅用于linux下对中文/日文支持的时候
ImeActivationFailedException 激活输入法失败时抛出
ErrorInResponseException 不常见,server端出错时可能会抛出
RemoteDriverServerException 不常见,好像是在某些情况下驱动启动浏览器失败的时候会报这个错
iichen:https://iichen.cn/?p=237
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇