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

xiaoxiao2021-02-28  15

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://www.baidu.com/&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"

转载请注明原文地址: https://www.6miu.com/read-2450354.html

最新回复(0)