Python Selenium 使用示例

0.基本:
from selenium import webdriver
driver=webdriver.Firefox() #获得火狐浏览器对象,IE:.Ie(),谷歌:.Chrome()
driver.get('http://www.baidu.com') #向浏览器发送网址
driver.find_element_by_id('kw').send_keys('hello') #输入
driver.find_element_by_id('kw').submit() #提交
driver.quit() #关闭


`1.定位元素:

(1)(定位单个元素)WebDriver提供了八种定位元素的方法,分别为:

find_element_by_id("id")

find_element_by_name("userName")

find_element_by_class_name("bg s_btn")

find_element_by_tag_name("input")

find_element_by_link_text("登录")

find_element_by_partial_link_text("很长") #一个很长的链接

find_element_by_xpath("/html/body/div[2]/form/input") #绝对路径

find_element_by_xpath("//input[@type='submit']") #属性

find_element_by_css_selector("form.fm>input#kw")


还可以这样写(其余以此类推):
from selenium.webdriver.common.by import By

find_element(By.ID,"id")
find_element(By.CLASS_NAME,"s_ipt")


(2)(定位一组元素),在定位单个元素的element后加上一个s:

inputs=driver.find_elements_by_tag_name('input') #所有input

for i in inputs:
    if i.get_attribute('type')=='checkbox':
        i.click()    #若type属性为复选框则勾选
        time.sleep(1)

cbs=driver.find_elements_by_css_selector('input[type=checkbox]')#所有复选框

for checkbox in cbs:
    checkbox.click()


driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()#去掉最后一个

#pop()或pop(-1)最后一个,pop(0)获取第一个,pop(1)第二个


`2.控制浏览器:

driver.back() #后退
driver.forward() #前进
driver.refresh() #刷新


元素操作:

clear() #清除文本
send_keys('hai') #模拟按键输入
click() #单击元素
submit() #提交表单
size #返回元素的尺寸
text #获取元素的文本
get_attribute('type') #获得属性值
is_displayed() #判断该元素是否可见

`3.鼠标事件:
from selenium.webdriver import ActionChains
mouse=driver.find_element_by_id('id')

ActionChains类常用方法:
perform() #执行所有ActionChains中存储的行为(提交鼠标操作)
ActionChains(driver).context_click(mouse).perform() #右击
ActionChains(driver).double_click(mouse).perform() #双击
ActionChains(driver).drag_and_drop(a,b).perform() #拖动,a源元素,b目标元素
ActionChains(driver).move_to_element(mouse).perform() #鼠标悬停

`4.键盘事件:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id('kw').send_keys('seleniumm') #输入
driver...('kw').send_keys(Keys.BACK_SPACE) #删除多输入的一个m
driver...('kw').send_keys(Keys.SPACE) #输入空格
driver...('kw').send_keys(Keys.CONTROL,'a') #ctrl+a全选
driver...('kw').send_keys(Keys.CONTROL,'x') #剪切

driver...('kw').send_keys(Keys.CONTROL,'v') #粘贴,('c'复制)
driver...('su').send_keys(Keys.ENTER) #回车


`5.设置元素等待:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element=WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,"kw"))) #显式等待

element.send_keys('selenium')

#element=WebDriverWait(driver,timeout=5,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"submit"))) #driver:浏览器驱动,timeout:最长超时秒数,poll_frequency:检测间隔时长,ignored_exceptions:超时后的异常信息,until:直到返回为True(until_not:返回False)

driver.implicitly_wait(10) #隐式等待10秒

#expected_conditions类提供的预期条件判断的方法:
is_displayed() #判断元素是否可见,例如:
el=driver.find_element_by_id('kw')
if el.is_displayed(): print('此元素可见')

title_is #判断当前页面的标题是否等于预期
title_contains #判断当前页面的标题是否包含预期字符串
presence_of_element_located #判断元素是否被加在DOM树里
visibility_of_element_located #判断元素是否可见
visibility_of #与上一个方法相同,只是上一个方法参数为定位,该方法参数为定位后的元素
presence_of_all_elements_located #判断是否至少有一个元素存在于DOM树中
text_to_be_present_in_element #判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value #判断某个元素的value是否包含预期的字符串
frame_to_be_available_and_switch_to_it #判断该表单是否可以切换进去,若可以则返回True并switch进去,否则返回False
invisibility_of_element_located #判断某个元素是否不存在于DOM树或不可见
element_to_be_clickable #判断元素是否可见并且可以点击
staleness_of #等到一个元素从DOM树中移除
element_to_be_selected #判断某个元素是否被选中,常用于下拉列表
element_selection_state_to_be #判断某元素的选中状态是否符合预期
element_located_selection_state_to_be #与上一个方法作用相同,上一个方法参数为定位后的元素,此方法参数为定位

alert_is_present #判断页面上是否存在alert


`6.多表单切换and多窗口切换

(1).表单切换: #在web应用中常有frame/iframe表单嵌套的应用

driver.switch_to.frame("if") #切换到