python+Selenium2.53.6学习(2)之元素定位

python的基础语法已经了解了,就不介绍了。

学习Selenium自动化编程,最重要的就是元素定位了,只有找准元素才能对它进行操作

1. 启动浏览器

因为浏览器环境是Firefox44,所以以下启动方式均以Firefox为例。

# *-coding:utf-8-*-
from selenium import webdriver
driver =webdriver.Firefox()
driver.get('https://www.baidu.com/')

即可看到火狐启动并且到百度首页。不过这里有一个奇怪的现象,就是浏览器会闪退然后才打开。

2. 定位元素

selenium提供了八种单数定位方式

1>.id定位    find_element_by_id()

2>. name定位    find_element_by_name()

3>.class定位    find_element_by_class_name()

4>.tag定位    find_element_by_tag_name()

5>link定位    find_element_by_link_text()

6>partial link定位 find_element_by_partial_link_text()

7>.XPath定位    find_element_by_xpath("//标签名[@属性='属性名']")   

8>. css定位    find_element_by_css_selector()

其次,还有八种复数定位,将以上的element替换为elements,定位的是多个元素,这个时候可以用索引找到具体的

find_element(By.ID,"")可以看做以上定位的简写变型,其中By需要导入

from selenium.webdriver.common.by import By

find_element(By.NAME,"")、find_element(By.CLASS_NAME,"")

这里需要着重介绍一下xpath和css定位,首先Firefox需要安装firebug/firepath插件,直接在浏览器内调试,方便减少代码改写时间。


XPath的定位 //标签名[@属性='属性名']这种格式,现在具体讲解一下

 //表示相对路径,也有绝对路径,像/html/body/div/div[1]这样的,但一般很少会用

属性包括id、class、name、href、value等,可参照html中的属性,均可以用这种方式

也可以多个属性组合,如//input[@type='radio' and @name='s1']

文本匹配:有时候只看到页面的内容,而不需要查看它的属性时可以参考text()匹配

//*[text()='文本内容']其中*匹配任何tag标签名

模糊匹配://*[contains(text(),'文本部分内容')],//*[contains(@name,'部分name名称')]等

以什么开头匹配 //*[starts-with(@id,'id属性名部分')]

返回到父节点向linux的..命令即可

选取的是百度首页的登录按钮

# 1.绝对路径
driver.find_element_by_xpath('/html/body/div/div/div/div/a[7]')
# 2.相对路径:
driver.find_element_by_xpath(".//*[@id='u1']/a[7]")
# 3.根据IDclass
driver.find_element_by_xpath(".//*[@id='u1']/a[@class='lb']")
# 4.根据IDname
driver.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login']")
# 5. 根据ID+href
driver.find_element_by_xpath(
    ".//*[@id='u1']/a[@href='https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5']")
# 6. 根据text()
driver.find_element_by_xpath(".//*[@id='u1']/a[text()='登录']")
# 7. contains
driver.find_element_by_xpath(".//*[@id='u1']/a[contains(@href,'login')]")
# 8. start-with()
driver.find_element_by_xpath(".//*[@id='u1']/a[starts-with(text(),'')]")
# 9. and
driver.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login' and @class='lb']")
# 10. following-sibling同级后
driver.find_element_by_xpath(".//*[@name='tj_trxueshu']/following-sibling::a[1]")
# 11. preceding-sibling同级前
driver.find_element_by_xpath(".//*[@class='bri']/preceding-sibling::a[2]")

CSS的定位:学过css的人应该都知道css的选择器,比如#id、.class、标签(不带任何符号),[属性='属性名']等



以上等级中1、2记住即可,3一般不做要求,但nth-child()需要注意,因为css定位中不用索引了,所以这个可以充当index作用

如:[name='NR']>option:nth-child(2)表示名字NR的第二个option子标签

一般来说:CSS比xpath定位更快,且语法更简洁

3. 基本操作

当元素定位到了需要对其进行操作,如输入框输入内容,下拉框选择等

1> clear()清空输入框

2> send_keys()输入文本内容

3> click()模拟单击鼠标

4> submit()模拟回车Enter

但毕竟基本操作能做的比较少,且分散,selenium的ActionChains包用来模拟鼠标事件

from selenium.webdriver.common.action_chains import ActionChains

context_click()右击

double_click()双击

drag-and_drop(source, target)拖动

move_to_element()悬停

selenium还提供了键盘事件

所有的操作都需要加上perform()才会生效

setup = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(setup).perform()

from selenium.webdriver.common.keys import Keys

send_keys(Keys.BACK_SPACE) 删除键(BackSpacesend_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Escsend_keys(Keys.ENTER) 回车键(Entersend_keys(Keys.CONTROL,'a') 全选(Ctrl+Asend_keys(Keys.CONTROL,'c') 复制(Ctrl+Csend_keys(Keys.CONTROL,'x') 剪切(Ctrl+Xsend_keys(Keys.CONTROL,'v') 粘贴(Ctrl+Vsend_keys(Keys.F1) 键盘F1
……
Send_keys(Keys.F5)键盘F5
…
send_keys(Keys.F12) 键盘F12

或者获取定位到元素的一些信息

1> 获取元素属性值    get_attribute('属性')

2> 判断元素是显示还是隐藏    is_displayed()

3>获取元素size    .size

4. 浏览器操作

具体有返回上页driver.back()、下一页driver.forward()、刷新driver.refresh()、退出driver.close()#关闭当前窗口、driver.quit()#退出浏览器,清空临时文件

获取title值    driver.title

获取浏览器名称    driver.name

5. 切换iframe

通过id/name/frame定位
switch_to_frame(name or id or frame_element )
通过页面上iframe的索引定位
driver.switch_to.frame(0)   # frameindex来定位
# 跳出所有frame,回到主界面
driver.switch_to.default_content()
driver.switch_to.parent_frame() # 返回上一级

6. 多窗口

多个窗口时需要切换到特定窗口操作,这个时候用到窗口句柄。

1.获取当前句柄
driver.current_window_handle
2.获取所有句柄
driver.window_handles

7. Select下拉框

selenium针对下拉框(select-option类型)有一个包Select

from selenium.webdriver.support.select import Select

首先定位到select下拉框

s = driver.find_element(By.ID, 'nr')
time.sleep(1)
Select(s).select_by_value('20')

Select提供了多种方法

select_by_index(index) #通过index选择
select_by_value(value) #通过value属性
select_by_visible_text(text) #通过选项可见文本
deselect_by_index(index)    # 反选
deselect_by_value(value) 
deselect_by_visible_text(text) 
deselect_all()      # 不选

8. 弹出框

alert框是浏览器弹出来的,是不能用web元素定位的,需要操作是要先切换到alert框上

# 切换到弹出框
a = driver.switch_to_alert()
#  打印弹出框文本信息
print(a.text)
#  确定按钮
a.accept()
# 取消按钮
a.dismiss()

浏览器的弹出框共分为

警告框alert

确认框confirm

提示框prompt

三种

注:测试完成后要quit()退出浏览器,不然c盘的临时文件会越来越多。

作业:

百度首页-选择设置-搜索设置-保存设置

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time
#Firefox 配置
prifile_directory = 'C://Users//Administrator//AppData//Roaming//Mozilla//Firefox//Profiles//ardla6e5.default'
profile = webdriver.FirefoxProfile(prifile_directory)

def alertClick(url):

    driver.get(url)
    '''第一步: 找到设置按钮'''
    setup = driver.find_element_by_link_text('设置')
    '''第二步: 鼠标悬停,点击搜索按钮'''
    ActionChains(driver).move_to_element(setup).perform()
    time.sleep(0.5)
    driver.find_element_by_link_text('搜索设置').click()
    # time.sleep(3)       # 页面跳转
    '''第三步: 设置界面,找到下拉框'''
    sel = driver.find_element(By.ID, 'nr')
    time.sleep(1)
    '''第四步: 设置下拉框选项'''
    Select(sel).select_by_index(2)
    sel.click()
    time.sleep(1)
    '''第五步: 点击保存设置按钮'''
    driver.find_element_by_css_selector('.prefpanelgo').click()
    time.sleep(1)
    '''第六步: 切换alert框,并点击确定'''
    alert = driver.switch_to_alert()
    alert.accept()

if __name__ == '__main__':
    driver = webdriver.Firefox(profile)
    alertClick('https://www.baidu.com')

find_Element()

by_id= "id"
by_xpath = "xpath"
by_link_text = "link text"
by_partial_text = "partial link text"
by_name = "name"
by_tag_name = "tag name"
by_class_name = "class name"
by_css_selector = "css selector"


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值