草庐IT

吐血整理 python 从零开始学UI自动化(含代码)持续更新,建议收藏!

白开水THEONE 2023-05-03 原文

第二章

--------------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()="系统设置"')

有关吐血整理 python 从零开始学UI自动化(含代码)持续更新,建议收藏!的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在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

  5. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码: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

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

随机推荐