web元素定位及操作()

单个元素定位:

#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()传入本地文件路径从而模拟上传功能

#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
Windows平台的AutoIt工具:


下载文件:

提前设置浏览器属性:

#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()
火狐浏览器可通过地址栏输入:about:config 进行设置

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()













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值