单个元素定位:
#coding=utf-8
from selenium import webdriver
dr=webdriver.Opera()
'''找元素
2???、前端工具是什么?segbug没找到,可以使用find搜索
#dr.find_element_by_id() 根据元素本身的属性来find element
#dr.find_element_by_name() 根据元素本身的属性来find element
#dr.find_element_by_class_name() 根据元素本身的属性来find element
#dr.find_element_by_tag_name() 根据标签来定位,如input,试用于定位1组元素:dr.find_elements_by_tag_name("input")[7]
3???、这个组是相对于什么的,如果两个div中有相同的标签是先使用其他方式,追溯到要定位的标签,然后再使用该方式
#dr.find_element_by_link_text() 根据文本链接
#dr.find_element_by_partial_link_text() 根据使用文本关键字链接
#dr.find_element_by_xpath() 根据元素所在的路径
()中的语法:
例子1:"//*[@id='kw']"
//:在某1个路径下面 4???:某路径是哪个路径
/:根目录
*:某标签如input
[@id='kw']:@后面跟上元素的属性
例子2:"//a[@id='s_username_top']/span" 可以往上追溯父级
解析:找[a标签中id属性为s_username_top]中的标签为input的元素,"//a[@id='s_username_top']/span[@id='1234']"
例子3:"//form[@id='form']/span[2]/input"解析:找[form标签中id属性为form]中的第2个标签为span(从1开始)的元素例子4:"/html/body[2]/..." 绝对路径即从html开始例子5:"//a[@id='s_username_top' and @class='s_ipt' ...]"同时使用多条件来确定元素,即使用布尔方法来定位元素:more...W3C上有更多内容#dr.find_element_by_css_selector()".s_ipt" class为s_ipt的元素"#s_ipt" id为s_ipt的元素"[name=wd]" []中属性为**的元素"span.s_ipt >input#kw" span标签中class为s_ipt 中标签为input的id为kw的元素,用>表示下级'''dr.find_element_by_tag_name("kw") #百度输入框dr.find_element_by_id("su") #百度一下按钮dr.find_element(By.ID, "kw")'''#看底层的实现:\site-packages\selenium\webdriver\remote的webdriver.py,就会发现# dr.find_element_by_id("kw")==dr.find_element(By.ID,"kw"),查看260行,使用后者需要导入class(By):from selenium.webdriver.common.by import By#???不懂怎么知道该导入哪些class,&该这样导入''''''help(By) 如何知道By有哪些方法''''''对于元素有可以进行的操作可以查看\site-packages\selenium\webdriver\remote的webelement.py''''''出现编码问题时,简便方法是使用python自带的IDE'''
注意:定位不到的时候注意是否有相同的属性值,元素是否在表单中,元素的属性值会变化
web元素控制:
from selenium import webdriver from time import sleep #使用Opera异常:无法打开页面,输入链接 #web端,在页面加载完全时,才操作下个步骤 driver=webdriver.Chrome() driver.maximize_window() #设置浏览器宽&高显示,参考数字为像素点:driver.set_window_size(380,500) #页面全屏化 ''' driver.get("https://www.baidu.com") driver.find_element_by_link_text("新闻").click() sleep(3) #页面后退及前进,一般采用get,跳转到页面 driver.back() driver.forward() #页面刷新 driver.refresh() print("baidu OK") ''' driver.get("http://www.126.com") #查看登陆前页面的title等信息,for断言 title=driver.title print(title) url=driver.current_url print(url) #定位该元素的时候,出现错误:无法找到该元素。 #原因:通过追溯该元素的所在发现,该元素所在的html,嵌套在iframe表单中 driver.switch_to_frame("x-URS-iframe") #先切换到该表单,默认接收id/name,无需指定 driver.find_element_by_name("email").clear() driver.find_element_by_name("email").send_keys("testingwtb") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("a123456") driver.find_element_by_id("dologin").click() #d对比submit() driver.switch_to_default_content()#退出表单到最外层:是指退出到当前表单吗?那此时焦点在哪里?若想找外层的元素,直接找,还是继续退? #断言,常用判断条件:title;url;text等 sleep(5) title=driver.title print(title) url=driver.current_url print(url) text=driver.find_element_by_id("spnUid").text print(text) assert text=="testingwtb@126.com" #此为python提供的断言方法,但不能统计,使用单元测试的,可以进行统计 #driver.quit()
元素组定位:
方法为在单个元素的基础上修改,直接在element后加s,即elements
#coding=utf-8
from selenium import webdriver
import os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('checkbox.html')
driver.get(file_path)
# 选择页面上所有的 tag name 为 input 的元素
inputs = driver.find_elements_by_tag_name('input')
# 打印当前页面上tag_name为input的个数
print len(inputs)
#然后从中过滤出 tpye 为 checkbox 的元素,单击勾选
for i in inputs:
if i.get_attribute('type') == 'checkbox':
i.click()
# 把页面上最后 1 个 checkbox 的勾给去掉:pop() 函数用于获取列表中的一个元素(默认为最后一个元素),pop()或 pop(-1) 默认获取一组元素中的最后一个,pop(0) 默认获取一组元素中的第一个。pop(1) 默认获取一组元素中的第二个。
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()
driver.quit()
多表单切换(遇到frame嵌套页面时,WebDriver每次只能在一个页面上识别元素,可使用switch_to_frame()先找到frame.html 中的<iframe>标签):
#id = "if" driver.switch_to_frame("if") #name = "nf" driver.switch_to_frame("nf")
#先通过 xpth 定位到 iframe xf = driver.find_element_by_xpath('//*[@class="if"]') #再将定位对象传给 switch_to_frame()方法 driver.switch_to_frame(xf)
……
#通过 switch_to_default_content()方法返回到上一层表单,默认对应与它最近的 switch_to_frame()方法 driver.switch_to_default_content()
多窗口切换:
#获得当前窗口句柄
sreach_windows= driver.current_window_handle
#获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
#切换到handle窗口
driver.switch_to_window(handle)
警告框处理:
switch_to_alert()
text 返回 alert/confirm/prompt 中的文字信息。
accept 点击确认按钮。
dismiss 点击取消按钮,如果有的话。
send_keys 输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错。
#coding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Firefox() driver.implicitly_wait(10) driver.get('http://www.baidu.com') #鼠标悬停相“设置”链接 link = driver.find_element_by_link_text(u'设置') ActionChains(driver).move_to_element(link).perform() #打开搜索设置 driver.find_element_by_class_name('setpref').cick() #保存设置 driver.find_element_by_css_selector('#gxszButton > a.prefpanelgo').click() #接收弹窗 driver.switch_to_alert().accept() driver.quit()
文件上传:
send_keys 实现上传:对于通过 input 标签实现的通过上传,通过 send_keys()传入本地文件路径从而模拟上传功能
Windows平台的AutoIt工具:#定位上传按钮,添加本地文件 driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
下载文件:
提前设置浏览器属性:
火狐浏览器可通过地址栏输入:about:config 进行设置#coding=utf-8 from selenium import webdriver import os fp = webdriver.FirefoxProfile() fp.set_preference("browser.download.folderList",2) fp.set_preference("browser.download.manager.showWhenStarting",False) fp.set_preference("browser.download.dir", os.getcwd()) fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream") #下载文件的类型 driver = webdriver.Firefox(firefox_profile=fp) driver.get("http://pypi.Python.org/pypi/selenium") driver.find_element_by_partial_link_text("selenium-2").click()
AutoIt
操作 Cookie(WebDriver 提供):
webdriver 操作 cookie 的方法有:
get_cookies() 获得所有 cookie 信息
get_cookie(name) 返回有特定 name 值有 cookie 信息
add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
delete_cookie(name) 删除特定(部分)的 cookie 信息
delete_all_cookies() 删除所有 cookie 信息
调用JavaScript(WebDriver提供了execute_script()方法来执行JavaScript代码):
如上下滚动条的处理:
…… <body οnlοad= "document.body.scrollTop=0 "> <body οnlοad= "document.body.scrollTop=100000 ">
……
scrollTop 设置或获取滚动条与最顶端之间的距离,scrollTop 的值以像素为单位。
#将页面滚动条拖到底部 js="document.documentElement.scrollTop=10000" driver.execute_script(js) time.sleep(3)
如上下滚动条:
#window.scrollTo(左边距,右边距); js=" window.scrollTo(200,1000);" driver.execute_script(js)
窗口截图(get_screenshot_as_file(指定图片的保存路径及文件名)):
#coding=utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.baidu.com') try: driver.find_element_by_id('kw_error').send_key('selenium') driver.find_element_by_id('su').click() except : driver.get_screenshot_as_file("D:\\baidu_error.jpg") driver.quit()
关闭窗口:
close()