web元素定位及操作()

来源:互联网 发布:如何自学编程 编辑:程序博客网 时间:2024/05/30 05:29

单个元素定位:

#coding=utf-8from selenium import webdriverdr=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 webdriverfrom 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.titleprint(title)url=driver.current_urlprint(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.titleprint(title)url=driver.current_urlprint(url)text=driver.find_element_by_id("spnUid").textprint(text)assert text=="testingwtb@126.com" #此为python提供的断言方法,但不能统计,使用单元测试的,可以进行统计#driver.quit()

元素组定位:

方法为在单个元素的基础上修改,直接在element后加s,即elements

#coding=utf-8from selenium import webdriverimport osdriver = 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 定位到 iframexf = 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-8from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsdriver = 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-8from selenium import webdriverimport osfp = 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 onload= "document.body.scrollTop=0 "><body onload= "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-8from selenium import webdriverdriver = 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()

                                             
0 0
原创粉丝点击