第二章
--------------WebDrriver元素定位------------------
白开水笔记,内涵代码可跟着敲一敲,ui自动化必须会的定位
2.0 WebDriver概述
只支持jdk1.8及以上
通过ms官方的webdriver支持Edge浏览器
通过mozilla官方的geckodriver来支持火狐
2.1 安装selenium
安装命令: pip install selenium
查看版本:pip show selenium
dos 退出某个环境:quit()
查看安装路径:where python
重要!!安装火狐浏览器驱动
https://github.com/mozilla/geckodriver/releases/tag/v0.31.0
解压后放到py安装目录下
2.2 WebDriver提供了八中定位元素方式,并提供对应的方法
这个是老方法不用了,仅供了解
1* id find_element_by_id("id属性值")
2* name find_element_by_name("name属性值")
3 link text find_element_by_link_text(“连接文本”)
4 partial link text find_element_by_partial_link_text(“部分连接文本”)
5 class name find_element_by_class_name(“类名”)
6 tag name find_element_by_tag_name(“标记名称”)
7* xpath find_element_by_xpath(“xpath表达式”)
8 css selector find_element_by_css_selector(“css表达式”)
新方法统一调用find_element()方法,通过类by来声明定位方法,并传入相应的定位参数
示例:
find_element(定位类型,定位具体信息)
需要导入类by
from selenium.webdriber.common.by import By
1* id find_element(By.ID,"id属性值")
2* name find_element(By.NAME,"name属性值")
3 link text find_element(By.LINK_TEXT,“连接文本”)
4 partial link text find_element(By.PARTIAL_LINK_TEXT,“部分连接文本”)
5 class name find_elemente(By.LINK_TEXT,“类名”)
6 tag name find_element(By.TAG_NAME,“标记名称”)
7* xpath find_element(By.XPATH,“xpath表达式”)
8 css selector find_element(By.CSS_SELECTOR,“css表达式”)
2.3 ID定位 核心知识点
from selenium import webdriver # 导入webdriver
from selenium.webdriver.common.by import By #导入By
from time import sleep #导入time
# 对火狐实例化
d = webdriver.Firefox()
# 定位元素
myname = d.find_element(By.ID,"username")
2.3.1 操作
文本框输入:
文本框.send_keys(数据)
myname.send_keys("张三")
单击按钮:
按钮.click()
tijiao = d.find_element(By.ID,"tijiao")
tijiao.click()
关闭浏览器:
driver.quit()
控制运行速度:
sleep(3)
2.4 name定位 参考id定位
2.5 linktext定位
find_element(By.LINK_TEXT,"链接文字")
lian1 = driver.find_element(By.LINK_TEXT,"连接文字")
sleep(1)
lian1.click() #点击连接
示例2:
url="https://www.baidu.com"
driver = webdriver.Firefox()
driver.get(url) #打开浏览器
news = driver.find_element(By.LINK_TEXT,"新闻")
new.click #点击连接
2.6 partial link text 定位
find_element(By.PARTIAL_LINK_TEXT,"部分链接文字")
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver= webdriver.Firefox()
url="https://www.baidu.com"
driver.get(url)
link = driver.find_element(By.PARTIAL_LINK_TEXT,"hao") #首页的hao123
sleep(2)
link.click()
2.7 class name 定位
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
url="打开的地址 "
driver.get(url)
data_username = "zhangsan"
data_password ="123456"
name = driver.find_element(By.CLASS_NAME,"username")
pw = driver.find_element(By.CLASS_NAME,"password")
submit = driver.find_element(By.CLASS_NAME,"submit")
name.send_keys(data_username)
pw.send_keys(data_password)
submit.click()
driver.quit() #退出浏览器
2.8 tag name定位(有很多时,只能定位第一个,后面的定位不到了)
mylink = driver.find_element(By.TAG_NAME,"a")
mylink.click()
driver.back() #返回
2.9 火狐插件安装插件
Try xpath --Xpath验证工具
xpath finder --生成Xpath工具
在浏览器按F12左侧的元素定位,点击元件,在查看器蓝色部分右击、
找菜单复制(copy),点击copy XPATH。即可复制元素路径
XPath 路径表达式
绝对路径定位元素
相对路径定位元素
2.10 绝对路径定位元素
绝对路径XPath表达式已斜线“/”开始,从根节点标记html开始,逐级
示例:/html
/html/body/form/textarea
精确定位基本语法: /html/body/form/input[@value='姓名']
python定位语法:
myname=driver.find_element(By.XPATH,"/htme/body/form/input[@value='姓名']")
重点说明:
为了精确定位。需要加一些属性说明
属性说明使用方括号[]括起来
属性名称前使用@前缀
属性说明格式:节点名称[@属性名="属性值"]
绝对路径定位缺点:表达式长,可维护性差,不推绝对路径定位方式,因为页面发生一点变化,原有定位的xpath表达式就会失效
2.11 相对路径定位元素
点对路径XPATH表达式已斜线“//”开始,表示在文档中的全部层级查找
精确定位基本语法: //input[@value='姓名']
重点说明:
相对路径查找以'//'开头,表示在html文档中的全部层级位置进行查找所有满足双斜线“//”之后规则的元素(无论层级关系)
推荐使用相对路径Xpath表达式,可以大大降低测试脚本中定位表达式的维护成本
2.12 谓词(就是附加哦条件)写在[]中的
//input[@id='password']
常用的方法:
使用页面元素的 属性值
使用页面元素的 索引号
索引号是从1开始
//input[1]
使用页面元素的 存在某属性
节点名称[@属性名称]
//input[@checked]
使用页面元素的 存在某子节点
节点名称[子节点名称]
//ul[lable]
u1 = driver.find_element(By.XPATH,"//ul[lable]")
使用页面元素的 子节点值
节点名称[子节点名称='子节点文本值']
//ul[li="英语"]
u2=driver.find_element(By.XPATH,"//ul[li = '英语']")
2.13 多条件查找:
如果通过一个属性信息不能定位到元素,可通过多个属性信息进行定位
语法:
//节点名称[@属性名1="属性值2"][@属性名2="属性值2"]
//节点名称[@属性名1="属性值2" and @属性名2="属性值2"]
a1=driver.find_element(By.XPATH,"//*[@id='linka' and @name='demo']")
2.14 通配符
'*'表示匹配任何元素节点
示例1:
//*[@id='username']查找任何id属性值等于username的元素节点
示例2:
//select[@name]/* 查找存在name属性的select节点的所有子节点
'@*'表示匹配任何属性
示例1:
//input[@*='password']查找任何属性值等于password的input元素节
示例2:
//select[@*]查找所有带有属性的select元素节点
示例3:
//*[@*='飞机']查找任何属性等于“飞机”的所有元素节点
2.15 css定位概述
css中文意思层叠样式单
dricer.find_element(By.CSS_SELENCE,"css表达式")
绝对路径定位
如:html>body>form>textarea
精确定位语法:html>body>form>input[value="姓名"]
相对路径定位
精确定位语法:input[value="姓名"]
2.16 css精确定位方式
1、属性名="属性值"
input[id="password"]
mypassword = driver.find_element(By.CSS_SELECTOR,'input[id="password"]')
2、使用属性:
input[checked]
mypassword = driver.find_element(By.CSS_SELECTOR,'input[checked]')
3、使用ID属性值:
input#password
mypassword = driver.find_element(By.CSS_SELECTOR,'input#password')
4、使用class属性值
input.username
mypassword = driver.find_element(By.CSS_SELECTOR,'input.username')
2.17 定位一组元素
批量操作多个元素
先获取一组元素,在从这组对象中过滤出需要操作的元素
WebDriver 提供find_elements()方法进行定位一组元素
注意:这是的element加了s
2.17.1 一些辅助功能
is_selecter() 判断按钮是否选中
get_attribute 获得属性值
示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
url = file:///D:/selenium_demo/demo11.html #这是我本地的demo你需要换成自己的
driver.get(url)
# 定位单选按钮,采用一组定位方式
pay = driver.find_elements(By.NAME, "pay")
可用下标使用元素,pay[2].click() #点击第三个元素(下标从0开始数)
# print(pay)
# 可以使for循环遍历列表pay,获取每一个元素信息
for i in pay: # 每次循环获得一个控件/元素,放在变量i中
if not i.is_selected(): # 判断一下该单选按钮是否选中,如果没有选中,就进行点击
i.click()
v = i.get_attribute("value") # 获取该控件的某个属性值,参数就是属性名称
print("点击的是那个一个按钮", v)
sleep(2)
# 定位复选按钮,采用一组定位方式
hobby = driver.find_elements(By.XPATH, "//*[@type='checkbox']")
list1 = []
list2 = []
list3 = []
for m in hobby:
list1.append(m.is_selected()) # 获取控件的初始状态,存到list1
list2.append(m.get_attribute('name')) # 获得每个复选框name属性值,存在list2中
print("复选框初始状态:", list1)
print("所有的爱好:", list2)
for h in hobby:
h.click() # 点击每一个复选框
if h.is_selected() == True: # 如果复选框最后选中
d = h.get_attribute("name") # 获得选中复选框的name属性的值
list3.append(d) # 把获得的name属性值存在list3中
print("选的的爱好包括:", list3)
sleep(3)
driver.quit()
2.30 text()函数 补充
# td标签中含“系统设置”这几个字的td
# 在谓词当中,使用test()函数,可以获得标签中的字符串
set = (By.XPATH, '//td[text()="系统设置"')
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim