精华内容
下载资源
问答
  • Minium 元素定位

    千次阅读 2020-10-29 15:42:23
    1、Wxml 左侧箭头定位到需查看的元素位置,即可查看元素 self.page.get_element(’.kind-list-text’) 元素定位这块官方文档也在不断的完善例子,大家也可以查看官方文档 api 讲解: 打开下载 minium-doc 文件: ...

    UI 自动化这个和其他端(web,app,pc)的实现原理大同小异,都是通过找到元素,然后进行拟人点击达到自动化的效果

    元素查看
    在这里插入图片描述

    1、Wxml 左侧箭头定位到需查看的元素位置,即可查看元素
    可以用以下几种方式定位元素

    • class选择器

    self.page.get_element(’.kind-list-text’)

    • 通过控件内的文字识别控件

    self.page.get_element(‘view’,inner_text=‘视图容器’)

    • 通过控件内的文字模糊匹配控件

    self.page.get_element(‘view’,text_contains=‘容器’)

    • 获取当前页面 相同class选择器 的全部元素

    self.page.get_elements(’.kind-list-text’)

    • 滚动到指定高度

    #300为滚动的高度,500的滚动继续时间
    self.page.scroll_to(300,500)

    元素定位这块官方文档也在不断的完善例子,大家也可以查看官方文档 api 讲解:
    打开下载 minium-doc 文件:
    http://localhost:3000/#/minium/Python/introduction

    展开全文
  • Webdriver元素定位 元素定位作用:让程序操作指定元素,就必须找到指定元素 Webdriver元素定位方式有8种: id name class_name tag_name link_text partial_link_text Xpath Css id定位 from selenium import ...

    Webdriver元素定位基本方法

    元素定位作用:从整个html页面上找到某个标签;让程序操作指定元素,就必须找到指定元素。

    Webdriver元素定位方式有8种:

    1. id
    2. name
    3. class_name
    4. tag_name
    5. link_text
    6. partial_link_text
    7. Xpath
    8. Css

    id定位 : find_element_by_id()

    from selenium import webdriver
    import time
    
    driver=webdriver.Chrome()
    url='http://aimaster.lenovo.com/login'
    driver.get(url)
    time.sleep(2)
    #输入用户名
    driver.find_element_by_id("userName").send_keys("wangxuan")
    time.sleep(2)
    #清除输入框内容
    driver.find_element_by_id("userName").clear()
    time.sleep(2)
    #重新输入用户名
    driver.find_element_by_id("userName").send_keys("wangxuan10")
    time.sleep(2)
    #输入密码
    driver.find_element_by_id("pwd").send_keys("Wx10@2019")
    time.sleep(2)
    
    

    其中,调用id定位方法时,id名可以使用网页内检查查看,查看结果:
    在这里插入图片描述

    name定位 :find_element_by_name()
    与id定位元素类似。

    class_name定位 :find_element_by_class_name()
    在这里插入图片描述
    但同一class可能对应不同元素,此时不能通过class定位。

    tag_name定位(标签): find_element_by_tag_name()

    #点击登录(通过标签定位)
    driver.find_element_by_tag_name("button").click()
    

    标签,可以通过网页内检查查看,查看结果:
    在这里插入图片描述
    由上图可知,该登录按钮的标签为button。
    但一般情况下,一个标签会对应多个元素,此时,不能使用标签定位元素。

    link_text定位: find_element_by_link_text()

    from selenium import webdriver
    import time
    
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com/?tn=sitehao123_15")
    driver.find_element_by_link_text("hao123").click()
    

    运行结果为跳转到超链接所指网址。
    在这里插入图片描述
    检查网页中的href说明它是个超链接。

    partial_link_text定位:find_element_by_partial_link_text()

    driver.get("https://www.baidu.com/?tn=sitehao123_15")
    driver.find_element_by_partial_link_text("ao123").click()
    

    超链接的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了。

    XPath定位 :driver.find_element_by_xpath()
    以上定位方式都是通过元素的某个属性来定位的,如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决。

    理解XPath:
    XPath即为XML Path的简称,它是一种用来确定XML/HTML文档中某部分位置的语言。HTML可以看做是XML的一种实现,所以Selenium用户可以
    Xpath用途:
    基于HTML文档结构使用XPath进行元素定位。
    通俗理解:
    如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它老爸(父元素),要是它老爸的属性也不是很明显,就找它爷爷;如果一个元素兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟,但是出生是有先后的,可以通过它在家里的排行老几定位到(xpath定位的索引从1开始)。

    查看XPath:
    (1)Chrome中查看:
    定位到某个元素,选中检查页面中相应代码右击,选中copy,再选择copy full xpath。
    (2)Firefox中查看:
    点击右上角Firebug按钮,点击查看页面中元素,定位到某元素,在xpath框中可查看到该元素xpath。

    driver.find_element_by_xpath("//*[@id='root']/section/main/div/form/div[3]/div/div/span/button").click()
    

    Css定位:find_element_by_css_selector()
    查看css路径:
    (1)Chrome中查看:
    (2)Firefox中查看:
    与查看XPath类似,将选项xpath改为css即可。

    CSS定位语法比XPath更为简洁、灵活,而且CSS定位的速度还比XPath快,推荐使用CSS定位。

    Css其他定位方法:Css定位方法

    1. 属性定位
    2. 标签与属性组合定位
    3. 层级关系定位

    定位一组元素
    定位一组元素

    操作元素(键盘和鼠标事件)

    简单操作
    1 点击页面按钮:click()
    2 清空输入框:clear()
    3 输入字符串:send_keys()

    submit提交表单
    submit()一般模拟回车键

    键盘操作
    1 先导入键盘模块
    2 模拟enter键 send_keys(Keys.ENTER)
    3 其他常见的键盘操作:
    键盘f1-f12:send_keys(Keys.F1)
    复制Ctrl+C:send_keys(Keys.CONTROL,‘c’)
    粘贴Ctrl+V:send_keys(Keys.CONTROL,‘v’)
    全选Ctrl+A: send_keys(Keys.CONTROL,‘a’)
    剪切Ctrl+X:send_keys(Keys.CONTROL,‘x’)
    制表键Tab:sen_keys(Keys.TAB)

    鼠标事件
    1 先导入模块
    from selenium.webdriver.common.action_chains import ActionChains
    2 perform()执行所有ActionChains()中的行为:
    鼠标悬停:move_to_element()
    右击鼠标:context_click()
    双击鼠标:double_click()
    3 例:在百度页面将鼠标悬浮于设置按钮上

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver=webdriver.Firefox()
    url='https://www.baidu.com/index.php?tn=monline_3_dg'
    driver.get(url)
    driver.implicitly_wait(10)
    mouse=driver.find_element_by_link_text("设置")
    #鼠标悬浮在设置按钮上
    ActionChains(driver).move_to_element(mouse).perform()
    
    展开全文
  • 网页开发时,在很多时候我们需要操作相同类名的元素,即class相同的元素。昨天参加笔试,有一道相关的题目没答上来:JavaScript获取页面中class为test的节点于是收集了一些相关的资料,在本文中列举了两种我觉得比较...

    网页开发时,在很多时候我们需要操作相同类名的元素,即class相同的元素。昨天参加笔试,有一道相关的题目没答上来:

    JavaScript获取页面中class为test的节点

    于是收集了一些相关的资料,在本文中列举了两种我觉得比较好的方法,不足之处,还望大家批评指正。如果大家有更好的方法,希望可以分享。

    Solution1 Jeremy Keuth方案

    Jeremy Keuth大叔在《JavaScript DOM 编程艺术》(第2版)(英文:DOM Scripting-Web Design with JavaScript and the Document Object Model)一书的第三章第四节中讲到了getElementsByClass这个方法,并讲到了如何在不支持该属性的浏览器(IE6,IE7和IE8,让我们鄙视他们)中应用这一方法,摘录在此,个别地方有修改。

    HTML5 DOM中新增了一个方法让我们通过class属性中的类名来访问元素,这就是:getELementsByClassName,由于方法比较新,某些的DOM实现里还没有,因此在使用的时候要当心。下面我们先来看一看这个方法能帮我们做什么,然后在讨论怎么可靠的使用该方法。

    与getELementsByTagName方法类似,getElementsByClassName也只接受一个参数,就是类名:

    getElementsByClassName(class)

    这个方法的返回值也与getElementsByTagName类似,都是一个具有相同类名的元素的数组,下面这行代码返回的就是一个数组,其中包含类名为“sale”的所有元素:

    document.getElementsByClassName("sale")

    使用这个方法还可以查找那些带有多个类名的元素。要指定多个类名,只要在字符串参数中用空格分隔类名即可。例如,在标签中添加下面这行代码:

    alert(document.getElementsByClassName("sale important").length);

    完整代码

    Shopping List

    What to buy

    Don't forget to buy this stuff.

    • A thin of beans
    • Cheese
    • Milk

    alert(document.getElementsByClassName("sale important").length);

    你会看到警告框中显示1,表示只有一个元素匹配,因为只有一个元素同时带有”important”和”sale”类名。注意,即使在元素的class属性中,类名的顺序是”sale important”而非参数中指定的”important sale”,也会照样匹配该元素。不仅类名的实际顺序不重要,就算元素还带有更多类名也没有关系。与使用getELementsByTagName一样,也可以组合使用getElementsByClassName和getElementById。如果你想知道在id为purchase的元素中有多少类名包含test的列表项,可以先找到那个特定的对象,然后再调用getElementsByClassName:

    var shopping=document.getElementById("purchase");

    var sales = shopping.getElementsByClassName("sale");

    这样,sales数组中包含的就只是位于”purchase”列表中的带有”sales”类的元素,运行下面这行代码,就会看到sales数组包含两项:

    alert(sales.length);

    这个getELementsByClassName方法非常有用,但只有较新的浏览器(Safari 3.1,Chorme,Firefox 3 and Opera 9.5以上)才支持它。为了弥补这一不足,DOM脚本程序员需要使用已有的DOM方法来实现自己的getElementsByClassName,有点像成人礼似的。而多数情况下,他们的实现过程都与下面这个getElementsByClassName大致相似,这个函数能适用于新老浏览器。

    function getElementsByClassName(node,classname){

    if(node.getElementsByClassName){

    return node.getElementsByClassName(classname);

    }else{

    var results = [];

    var elems = node.getElementsByTagName("*");

    for(var i=0;i

    if(elems[i].className.indexOf(classname)!=-1){

    results[results.length]=elems[i];

    }

    }

    return results;

    }

    }

    这个getElementsByClassName函数接受两个参数。第一个node表示DOM树中的搜索起点,第二个classname就是要搜索的类名了。如果传入节点上已经存在了适当的getElementsByClassName函数,那么这个新函数就直接返回相应的节点列表。如果getElementsByClassName函数不存在,这个新函数就会循环遍历所有标签,查找带有相应类名的元素。

    这个方法的缺点是不适用于多个类名。

    如果使用这个函数来模拟前面取得购物列表的操作,就可以这样写:

    var shopping=document.getElementById("purchase");

    var sales = shopping.getElementsByClassName(shopping,"test");

    console.log(sales);

    因此,要解决文章开头的那道题目,所用代码如下:

    Shopping List

    What to buy

    Don't forget to buy this stuff.

    • A thin of beans
    • Cheese
    • Milk

    function getElementsByClassName(node,classname){

    if(node.getElementsByClassName){

    return node.getElementsByClassName(classname);

    }else{

    var results = [];

    var elems = node.getElementsByTagName("*");

    for(var i=0;i

    if(elems[i].className.indexOf(classname)!=-1){

    results[results.length]=elems[i];

    }

    }

    return results;

    }

    }

    var body = document.getElementsByTagName("body")[0];

    var sales= getElementsByClassName(body,"sales");

    console.log(sales);

    Solution2 Robert Nyman方案

    搜索匹配的DOM元素的方法还有很多,但真正高效的却不多,Jeremy Keuth大叔的方法有一个缺点就是不能用于多个类名,2008年,Robert Nyman在文章 The Ultimate GetElementsByClassName, Anno 2008中提供了自己的解决方案。在2005年,Robert大叔就已经给出了自己的getElementsByClassName的函数,在2008年的时候,修改了部分代码,添加了许多新的功能:

    1.如果当前浏览器支持getElementsByClassName函数,则调用该原生函数;

    2.如果当前浏览器支持则使用XPath;//小飞鱼:一种浏览器内置的定位XML文档的强大方式,不过浏览器支持方面不统一

    3.支持多个类名的搜索,不计先后顺序;

    4.返回真正的节点数组,而不是原生的一个nodelist。//小飞鱼:原生的getElementsByClassName方法返回的是一个NodeList对象,它很像数组,有length和数字索引属性,但并不是数组,不能用pop,push等数组特有的方法,Robert提供的代码中,将NodeList对象转成了数组。可以将NodeList对象转换成数组的方法:

    myList = Array.prototype.slice.call (myNodeList)

    这是Robert大叔的方法,有些地方还不太明白,待我研究一下再来更新好了。

    /*

    Developed by Robert Nyman, http://www.robertnyman.com

    Code/licensing: http://code.google.com/p/getelementsbyclassname/

    */

    var getElementsByClassName = function (className, tag, elm){

    if (document.getElementsByClassName) {

    getElementsByClassName = function (className, tag, elm) {

    elm = elm || document;

    var elements = elm.getElementsByClassName(className),

    nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,

    returnElements = [],

    current;

    for(var i=0, il=elements.length; i

    current = elements[i];

    if(!nodeName || nodeName.test(current.nodeName)) {

    returnElements.push(current);

    }

    }

    return returnElements;

    };

    }

    else if (document.evaluate) {

    getElementsByClassName = function (className, tag, elm) {

    tag = tag || "*";

    elm = elm || document;

    var classes = className.split(" "),

    classesToCheck = "",

    xhtmlNamespace = "http://www.w3.org/1999/xhtml",

    namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,

    returnElements = [],

    elements,

    node;

    for(var j=0, jl=classes.length; j

    classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";

    }

    try {

    elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);

    }

    catch (e) {

    elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);

    }

    while ((node = elements.iterateNext())) {

    returnElements.push(node);

    }

    return returnElements;

    };

    }

    else {

    getElementsByClassName = function (className, tag, elm) {

    tag = tag || "*";

    elm = elm || document;

    var classes = className.split(" "),

    classesToCheck = [],

    elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),

    current,

    returnElements = [],

    match;

    for(var k=0, kl=classes.length; k

    classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));

    }

    for(var l=0, ll=elements.length; l

    current = elements[l];

    match = false;

    for(var m=0, ml=classesToCheck.length; m

    match = classesToCheck[m].test(current.className);

    if (!match) {

    break;

    }

    }

    if (match) {

    returnElements.push(current);

    }

    }

    return returnElements;

    };

    }

    return getElementsByClassName(className, tag, elm);

    };

    展开全文
  • minium 踩坑 前端组件#shadow-root

    千次阅读 2020-12-30 18:14:49
    在页面遇到#shadow-root动态元素前端自定义的组件,其下的子元素使用id和class定位一般都找不到这个元素 可以尝试 class ComponentTest(minium.MiniTest): def test_Study(self): self.page.get_element('view...

    在页面遇到#shadow-root动态元素前端自定义的组件,其下的子元素使用id和class定位一般都找不到这个元素
    在这里插入图片描述
    可以尝试

    class ComponentTest(minium.MiniTest):
     	def test_Study(self):
    		self.page.get_element('view[class='card hamburger']')
    

    结果: None
    如果想要拿到第一种方法就是先把顶层的page下的所有元素获取到

    class ComponentTest(minium.MiniTest):
     	def test_Study(self):
    		wxml = self.page.get_element('page').inner_wxml
    		print(wxml)
    

    到格式化网站格式化查看class元素是和小程序显示到不同的,在class元素的前端
    html格式化链接

    # 截取下的一段标签对比
    <view bindtap=“handleCardTap" class="card hamburger" data-detail-url="/ pages/audio/aud io? cmdId=1308668002679320576”>
    
    <view class="hamburger-index--card hamburger-index--hamburger" data-detail-url="/pages/audio/audio?cmdId=1308668002679320576">
    

    查看到到元素,多了这个元素hamburger-index–他存在class类的前面部分,这个元素是前端自定义的,使用"hamburger-index–card hamburger-index–hamburger"定位就能定位到了

    第二种方法就是绝对路径
    如标签有文本,也可使用标签加文本定位

    class ComponentTest(minium.MiniTest):
     	def test_Study(self):
    		self.page.get_element('text',inner_text="文本")
    

    第三种方式
    在这里插入图片描述
    可以选中需要定位的元素,在模拟器查看,可以显示可用的class属性

    以上为踩坑记录,会更具后续理解修改本文!
    展开全文
  • 我考察了Appium、Airtest和Minium三个框架,并将三者做了对比,形成了以下图表: Appium实现微信小程序自动化测试的手段基本上还是套用针对 Hybrid App 的测试方案,通过定位H5 App资源控件,并结合屏幕坐标的方式来...
  • 大家好,我是小码哥,今天整理了一份minium微信小程序自动化测试框架手册,希望能对你有帮助! 目录 简介 特性 暂不支持 快速开始 运行环境 必要的知识 安装 开始使用 更多能力 常见问题排查 测试进阶 ...
  • 文末有福利在Selenium WebDriver中查找元素:“ FindElement”和“ FindElements”之间的区别查找元素查找元素如果定位器发现了多个Web元素,则返回...
  • 查找算法总结

    2021-12-04 11:15:19
    分块查找中,需要建立一个“索引表”来划分块区域,通过定位某一块区域来查找相应信息; 索引表包括两项内容:最大关键项、最大关键项块区域的指针项; 对索引表来说是有序的顺序表,可用顺序查找和折半查找两种...
  • 基于pytest实现测试用例收集方案、自定义参数化方案、页面元素定位数据存储方案、测试用例数据存储和维护方案,这样可直接进入到设计编写测试用例业务代码阶段,避免重复设计这些方案以及方案不统一导致维护复杂、...
  • } // 求取极大值和极小值,node class 实现了这个功能 static link_type minium(link_type x) { return (link_type) __rb_tree_node_base::minimun(x); } static link_type maximum(link_type x) { return (link_...
  • 英语词根词缀记忆法

    万次阅读 多人点赞 2017-02-06 11:32:55
    三种元素的不同顺序的排列组合构成了千变万化的英语单词。由词根添加前缀、后缀而构成的单词的方法叫派生法。派生的方式有多种,有的只加一个词缀,有的则要添加多个词缀。 例如: 1、 前缀 + 词根 pro- + pel --> ...

空空如也

空空如也

1
收藏数 13
精华内容 5
关键字:

minium定位class元素

友情链接: 871029.zip