GVKun编程网logo

Webdriver的官方定位器策略(webdriver定位元素8种方法)

23

最近很多小伙伴都在问Webdriver的官方定位器策略和webdriver定位元素8种方法这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展9.0toast定位+WebDriverW

最近很多小伙伴都在问Webdriver的官方定位器策略webdriver定位元素8种方法这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展9.0 toast 定位 + WebDriverWait 显示等待、javascript – 在量角器/ WebDriverJS中的by.js定位器是什么?、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?、PHP 客户端的:webdriver php-webdriver等相关知识,下面开始了哦!

本文目录一览:

Webdriver的官方定位器策略(webdriver定位元素8种方法)

Webdriver的官方定位器策略(webdriver定位元素8种方法)

在W3c webdirver官方文档中,明确指出了定位策略是:

State   KeywordCSS selector    "css selector"Link text selector  "link text"Partial link text selector  "partial link text"Tag name    "tag name"XPath selector  "xpath"

但是,Selenium的有线协议允许:

class name  css selectorid  namelink textpartial link texttag namexpath

在THEORY中,Selenium的文档已过时,新规范文档中包含“真实”故事。然而…

我在最新的Chrome浏览器自己的Webdriver上进行了一些测试,可以确认这一点,name并且class name两者都可以工作。但是,它们不在规格范围内。

我记得在阅读Chromium问题时曾说过,他们只会实施官方的Webdriver规范。

现在:我知道通用答案,其中“规格并非总是遵循100%”等。但是,我想知道的是:

  • 您可以在Chromium中找到实现此功能的代码吗?(欢迎链接)
  • Chromium邮件列表中是否有关于这些的讨论?
  • “非官方”命令(在“旧”硒规范文件中有记录)是否有可能保留?你在哪里读的?

答案1

小编典典

是的,您看对了。

根据目前WebDriver - W3C Candidate Recommendation的Locator Strategies征募情况如下:

  • "css selector" :CSS选择器
  • "link text" :链接文本选择器
  • "partial link text" :部分链接文本选择器
  • "tag name" : 标签名
  • "xpath" :XPath选择器

但是,JsonWireProtocol曾经曾经被用来支持下面列出的“定位器策略”,但是目前该文档明确指出其状态为“已过时”:

  • class name:返回其类名称包含搜索值的元素;不允许使用复合类名称。
  • css selector:返回与CSS选择器匹配的元素。
  • id :返回其ID属性与搜索值匹配的元素。
  • name :返回其NAME属性与搜索值匹配的元素。
  • link text :返回其可见文本与搜索值匹配的锚元素。
  • partial link text :返回一个锚元素,其可见文本部分与搜索值匹配。
  • tag name :返回其标签名称与搜索值匹配的元素。
  • xpath:返回与XPath表达式匹配的元素。提供的XPath表达式必须“按原样”应用于服务器;如果表达式不是相对于元素根的,则服务器不应修改它。因此,XPath查询可能返回根元素的子树中未包含的元素。
    快照:

定位器策略

更改通过相应的客户端特定绑定传播。对于Selenium-Java客户,这是客户代码,我们在其中为用户提供开关柜:

        switch (using) {          case "class name":            toReturn.put("using", "css selector");            toReturn.put("value", "." + cssEscape(value));            break;          case "id":            toReturn.put("using", "css selector");            toReturn.put("value", "#" + cssEscape(value));            break;          case "link text":            // Do nothing            break;          case "name":            toReturn.put("using", "css selector");            toReturn.put("value", "*[name=''" + value + "'']");            break;          case "partial link text":            // Do nothing            break;          case "tag name":            toReturn.put("using", "css selector");            toReturn.put("value", cssEscape(value));            break;          case "xpath":            // Do nothing            break;        }        return toReturn;

现在,您的问题必须是为什么在W3C Specs和中进行此更改clients。根据#1042,WebDriver贡献者的回答很简单:

This keeps the specification simple as these can be implemented using the CSS selector, which maps down to querySelector/querySelectorAll.

9.0 toast 定位 + WebDriverWait 显示等待

9.0 toast 定位 + WebDriverWait 显示等待

Toast  判断 ----- 基本操作问题

首先基本操作,进入安卓市场的账号密码页面 ---

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.touch_action import TouchAction #导入Touch Action类
import time,re,os
Start={}
Start[''platformName'']=''android''    #设备型号  android或者ios
Start[''platformVersion'']=''5.1''  #安卓设备版本号
Start[''deviceName'']=''192.168.176.101:5555''     #安卓设备名称
Start[''app'']=r''C:\Users\Administrator\Desktop\xuexi\apk\anzhuoshichang_16793302.apk''    #设备路径  pc电脑存放apk包的路径
#上面的路径不推荐这种写法,但是目前先这么写!后续告诉大家正确的写法
Start[''appPackage'']=''com.hiapk.marketpho''      #包名
Start[''appActivity'']=''com.baidu.appsearch.LauncherActivity''        #容器
Start[''noReset'']=''True''           #是否重新安装app  True不重新安装
Start[''unicodeKeyboard'']=''True''   #是否禁用手机键盘  True禁用手机输入法
Start[''resetKeyboard'']=''True''     #是否启动appium自带键盘 True开始手机输入法
Start[''automationName'']=''uiautomator2''     #可选模式  本教程默认 Uiautomator2
Start[''newCommandTimeout'']=''400''  #超时时间(s)
driver = webdriver.Remote(''http://127.0.0.1:4723/wd/hub'',Start)
driver.implicitly_wait(10)  #隐式等待十秒
time.sleep(3)
''''''模拟器或者手机上已经有了安卓市场,那么启动之后,直接点击左上角的头像图标''''''
head=''com.hiapk.marketpho:id/person_center_btn''
driver.find_element_by_id(head).click()  #点击头像图标进入个人中心
time.sleep(5)
login=''com.hiapk.marketpho:id/please_login''
driver.find_element_by_id(login).click() #点击立即登录
time.sleep(5)

为什么要进入到这个页面呢 --- 因为这个页面输入有个 toast 提示............

如图所示:这个 toast 提示是在 uiautomator 上面定位不到的,所以需要稍微处理一下!

 

 

 

然后随便输入一个手机号码和一个密码登记登录:

 

Elements=driver.find_elements_by_id(''com.hiapk.marketpho:id/edt_text'')
Elements[0].set_text(''17700000000'')  #因为账号输入和密码输入id相同,所以需要用到elements,之前有介绍过
Elements[1].set_text(''123456'')
driver.find_element_by_id(''com.hiapk.marketpho:id/btn_login'').click()

 

 

这时手机出现下图所示的 toast 提示:

 

之前章节有说过权限弹窗定位的那个方法 -- 用在这里就 O 了!记得导入这个库

from selenium.webdriver.support import expected_conditions as EC  #实际上是调用的这个类 expected_conditions  ------as EC 重命名

 

使用方法: WebDriverWait(driver,30, 0.5).until(EC.presence_of_element_located(Element))

 

expected_conditions 类提供的预期条件判断方法:

title_is: 判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains : 判断当前页面的 title 是否包含预期字符串,返回布尔值
presence_of_element_located : 判断某个元素是否被加到了 dom 树里,并不代表该素一定可见
visibility_of_element_located : 判断某个元素是否可见。可见代表元素非隐藏,并且元素的宽和高都不等于 0
visibility_of : 跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了
presence_of_all_elements_located : 判断是否至少有 1 个元素存在于 dom 树中。
text_to_be_present_in_element : 判断某个元素中的 text 是否 包含 了预期的字符串
text_to_be_present_in_element_value : 判断某个元素中的 value 属性是否 包含 了预期的字符串
frame_to_be_available_and_switch_to_it : 判断该 frame 是否可以 switch 进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
invisibility_of_element_located : 判断某个元素中是否不存在于 dom 树或不可见
element_to_be_clickable : 判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable
staleness_of : 等某个元素从 dom 树中移除,注意,这个方法也是返回 True 或 False
element_to_be_selected : 判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be : 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be : 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
alert_is_present : 判断页面上是否存在 alert
 

 注:如果 toast 用 presence_of_element_locatedpan 判断不到,可以考虑用 alert_is_present

 

try:
    Element = ("xpath", "//*[@text=''网络连接异常,请重试'']")
    WebDriverWait(driver,30, 0.5).until(EC.presence_of_element_located(Element))
    print(''获取到toast提示:网络连接异常,请重试'')
except:
    print(''凉了,兄碟'')

稍微换一下写法呢:

结果:很舒服 --- 也是可以的 --

try:
    Element = "//*[@text=''网络连接异常,请重试'']"
    WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))
    print(''获取到toast提示:网络连接异常,请重试'')
except:
    print(''凉了,兄碟'')

备注:toast 定位基本上是稳定的,但是偶尔会判断不鸟,属于正常现象,建议把扫描时间 0.5s 换成 0.1s 会稳定很多!

 

 

WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))

 

这个是显示等待, 意思就是 等待 60s   在这六十秒中,每隔 0.5 秒扫描一次,是否出现元素 Element

 

 

 

现在把上面的强制等待 time.sleep()全部换成显示等待!

 

 

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.touch_action import TouchAction #导入Touch Action类
import time,re,os
Start={}
Start[''platformName'']=''android''    #设备型号  android或者ios
Start[''platformVersion'']=''5.1''  #安卓设备版本号
Start[''deviceName'']=''192.168.176.101:5555''     #安卓设备名称
Start[''app'']=r''C:\Users\Administrator\Desktop\xuexi\apk\anzhuoshichang_16793302.apk''    #设备路径  pc电脑存放apk包的路径
#上面的路径不推荐这种写法,但是目前先这么写!后续告诉大家正确的写法
Start[''appPackage'']=''com.hiapk.marketpho''      #包名
Start[''appActivity'']=''com.baidu.appsearch.LauncherActivity''        #容器
Start[''noReset'']=''True''           #是否重新安装app  True不重新安装
Start[''unicodeKeyboard'']=''True''   #是否禁用手机键盘  True禁用手机输入法
Start[''resetKeyboard'']=''True''     #是否启动appium自带键盘 True开始手机输入法
Start[''automationName'']=''uiautomator2''     #可选模式  本教程默认 Uiautomator2
Start[''newCommandTimeout'']=''400''  #超时时间(s)
driver = webdriver.Remote(''http://127.0.0.1:4723/wd/hub'',Start)
driver.implicitly_wait(10)  #隐式等待十秒
time.sleep(3)
''''''模拟器或者手机上已经有了安卓市场,那么启动之后,直接点击左上角的头像图标''''''
head=''com.hiapk.marketpho:id/person_center_btn''
driver.find_element_by_id(head).click()  #点击头像图标进入个人中心

# time.sleep(5)
login=''com.hiapk.marketpho:id/please_login''
#判断十秒内是否获取到登录元素
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_id(login))
driver.find_element_by_id(login).click() #点击立即登录
# time.sleep(5)
Elements=driver.find_elements_by_id(''com.hiapk.marketpho:id/edt_text'')
#点击立即登录之后,获取下一页页面的元素
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_xpath(''//*[@text="手机/邮箱/通行证"]''))
Elements[0].set_text(''17700000000'')  #因为账号输入和密码输入id相同,所以需要用到elements,之前有介绍过
Elements[1].set_text(''123456'')
driver.find_element_by_id(''com.hiapk.marketpho:id/btn_login'').click()
#因为这个toast提示时间出来的有点晚,所以等待时间稍微加那么一丢丢
# try:
#     Element = ("xpath", "//*[@text=''网络连接异常,请重试'']")
#     WebDriverWait(driver,60, 0.5).until(EC.presence_of_element_located(Element))
#     print(''获取到toast提示:网络连接异常,请重试'')
# except:
#     print(''凉了,兄碟'')
try:
    Element = "//*[@text=''网络连接异常,请重试'']"
    WebDriverWait(driver,60, 0.5).until(lambda driver:driver.find_element_by_xpath(Element))
    print(''获取到toast提示:网络连接异常,请重试'')
except:
    print(''凉了,兄碟'')

 

基本上原理都是大同小异.... 理解了之后,可以写的花里胡哨的!!!!!

 

javascript – 在量角器/ WebDriverJS中的by.js定位器是什么?

javascript – 在量角器/ WebDriverJS中的by.js定位器是什么?

最近,我注意到一个新的定位器被添加到量角器文档 – by.js()

Locates an elements by evaluating a JavaScript expression,which may be either a function or a string.

我明白这个定位器提供了什么,但是当这个定位器可以使用时,我错过了真实的用例.我什么时候应该喜欢使用by.js而不是其他内置的定位器,如by.css?

解决方法

我觉得用例是使用核心JavaScript函数来获取元素,每当css和其他元素定位器不能帮助或者没有可以使用的属性时.情景 –

>如果您使用核心JavaScript函数将其传递给browser.executeScript,那么可以使用by.js替换它.

示例: –

假设如果你必须得到一个出现在两者之间的元素,你可以这样获得 –

var ele = element(by.js(function(){
    var ele1 = document.getElementById('#ele1');
    var ele2 = document.getElementById('#ele2');
    var val = ele1.compareDocumentPosition(ele2);
    if(val === 4) return ele1;
    else return ele2;
}));

>如果你想使用它的css值,如颜色,字体等获取元素.虽然过滤器可以在这种情况下使用,但是by.js也支持它.
>如果元素不能被css或xpath或任何其他定位符访问,例如具有动画或转换的伪元素.

示例: –

假设有元素具有:before和:在转换之后 –

.element:before {
    color: rgb(255,0);
}

要验证元素的颜色,我们可以使用by.js传递一个javascript语句来获取元素 –

var ele = element(by.js(function(){
    return window.getComputedStyle(document.querySelector('.element'),':before');
}));
expect(ele.getCssValue('color')).toEqual('rgb(255,0)');

希望它有帮助.

node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?

node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?

我们的团队正计划开发一个框架来自动化手动测试用例.但我们仍然坚持在 javascript和java之间进行选择.通过一些搜索,我们发现Webdriverjs是javascript的selenium绑定.现在,主要障碍是我们是否应该使用selenium-webdrier来使用webdriverjs或java的javascript?

我们已经使用selenium-webdriver了解java,但是当我们开始使用新框架时,我们只想打开简单,快速和可靠的选项.

请建议javascript与webdriverjs(我们需要学习javascript)或java与selenium-webdriver?

解决方法

我们遇到了您现在看到的同样挑战.
Java堆栈上有很多selenium工程师,但在Node.js和selenium-webdriver堆栈上并不多.

大多数较新的现代测试框架都是在Node.js中完成的,因为前端和后端都是使用NodeJS完成的,并将继续这种趋势.我要问的问题是开发团队是使用Java(例如Tomcat)还是使用Node.js来开发他们的产品.如果他们使用的是Node.js,那么将测试框架用同一种语言编写也是理想的.

这是为了方便

>开发和自动化团队,定位器等之间的协作.
>减轻开发人员编写硒测试的摩擦

marcel Erz在我们的South Bay Selenium聚会上对此进行了非常好的介绍.我强烈建议您在做出决定之前先仔细阅读.

Java与JavaScript(用于UI测试)

>前端工程师编写的大多数测试
>不熟悉Java及其生态系统
>上下文切换
>不太可能接受测试

http://www.marcelerz.com/blog/talk-nodejs-based-selenium-testing-south-bay-selenium-meetup

现在,如果您开始使用Javascript,那么主要的挑战当然是异步.大多数自动化工程师习惯于使用Python和Java同步模式.需要一些时间来习惯javascript的异步行为.但最终结果是值得的.

我们的框架主要用Node.js编写,我们使用Mocha作为我们的线束和测试运行器.推荐的断言库是Chai,但如果您需要特殊需求,可以使用其他库.

我们选择的selenium库是nd上的WebDriverJs(区分大小写)又名selenium-webdriver,它是官方的JavaScript端口.我们使用selenium-webdriver的主要原因之一是代码可读性以及实现类似同步语法的能力,以便让Java测试工程师牢记.这可以通过利用内置的Promise Manager控制流和Mocha Test Wrapper来实现,它可以自动处理对promise管理器的所有调用,使代码非常同步.

https://code.google.com/p/selenium/wiki/WebDriverJs#Writing_Tests

然后,这是一个添加自己的框架和构建页面对象的问题. Javascript中的页面对象是一个全新的野兽,您必须很好地掌握原型以及如何模拟Java的继承.

您还应该在npm中使用selenium-standalone作为本地和远程执行的唯一通信点,而不是在测试中创建驱动程序实例(本地/远程).这样,框架具有相同的接口并使事情保持一致.您不希望跟踪多个本地驱动程序可执行文件并更新它们.一个包装可以处理所有事情.

如果您已经阅读过这里,并且您非常确定您将使用Node.js路由而不是Java.下面是我们框架的一个非常简化的版本,可以帮助您入门.它具有上面描述的所有实现.欢迎任何拉动请求!

https://github.com/mekdev/mocha-selenium-pageobject

PHP 客户端的:webdriver php-webdriver

PHP 客户端的:webdriver php-webdriver

php-webdriver 是一个 PHP 客户端的 webdriver。This WebDriver client aims to be as close as possible to bindings in other languages. The concepts are very similar to the Java, .NET, Python and Ruby bindings for WebDriver.

项目主页:http://www.open-open.com/lib/view/home/1428998472267

我们今天的关于Webdriver的官方定位器策略webdriver定位元素8种方法的分享已经告一段落,感谢您的关注,如果您想了解更多关于9.0 toast 定位 + WebDriverWait 显示等待、javascript – 在量角器/ WebDriverJS中的by.js定位器是什么?、node.js – 带有webdriverjs的javascript或带有selenium-webdriver的java?、PHP 客户端的:webdriver php-webdriver的相关信息,请在本站查询。

本文标签: