
以下内容来自互联网,版权归原作者。
思路:因为没有name,id;其实剩下的选择已不多,要么xpath,要么className。xpath木有好印象(稳定性不高,加之10x后需要写全路径,相当崩溃),我决定十分个人色彩的建议使用className。
具体方法:
用className获取所有该类型的元素;
根据元素的位置确定元素的index;
获取目标元素。
示例:
List<WebElement> lis = driverfindElementsByClassName("androidwidgetImageView");//获取ImageView的所有元素
WebEelement targetEle = lisget(0);//获取列表中第一个元素
进阶:
你可以自己定义一个className的常量,然后封装个方法,提供大家使用:
public List<WebElement> getAllImges(){
List<WebElement> lis = driverfindElementsByClassName(AndroidClassNameIMAGEVIEW);
return lis;
}
使用的时候,就只需要调用此方法就可以了
此方法的好处:通吃的方法,基本可解决定位的问题;能解决多语言(自然语言)的困扰;
缺点:因为系统需要去获取List,就目前来看,运行效率不是很高,那直接是可以用肉眼看的到的速度在跑。。。
2、关于没有name,没有ID的元素的定位---特用篇
因为是特用,所以需要对页面元素做进一步的分析,找出其中的特性。这些特性主要为className,index,以及clickable等属性。
场景1:同一个页面有10个ImageView对象,而我们的目标元素的index为4,而同为ImageView且index为4的页面只有2个。那我们就可以根据这2个条件来组合查询条件,提高效率。
示例:
List<WebElement> lis = driverfindElementsByAndroidUIAutomator("new UiSelector()className("+"androidwidgetImageView"+")index(4)");
基于这个场景可以封装一个方法:
public List<WebElement> getElementsByClassAndIndex(String classname,int index){
List<WebElement> lis =null;
lis = driverfindElementsByAndroidUIAutomator("new UiSelector()className("+classname+")index("+index+")");
return lis;
}
场景2:同一个页面有10个ImageView对象,而其中index为4的有5个,而这时我们发现我们的目标元素的是clickable的。然后review页面发现,同时满足上述条件的只有2个。那么。。。
示例:
List<WebElement> lis = driverfindElementsByAndroidUIAutomator("new UiSelector()className("+"androidwidgetImageView"+")index(4)clickable(true)");
同样可以封装一个方法:
public List<WebElement> getElementsByClassAndIndexAndClickable(String classname,int index){
List<WebElement> lis =null;
lis = driverfindElementsByAndroidUIAutomator("new UiSelector()className("+classname+")index("+index+")clickable(true)");
return lis;
}
场景3:在分析页面元素的时候发现,页面相对比较简单,而且其中只有目标元素的index为4
示例:
driverfindElementByAndroidUIAutomator("new UiSelector()index("+index+")");
同样得到一个方法
public WebElement getElementByIndex(int index){
return driverfindElementByAndroidUIAutomator("new UiSelector()index("+index+")");
}
使用Selenium WebDriver驱动浏览器测试的过程中多多少少会遇到一些折腾人的问题,总结了一部分,做下分享。
一、隐藏元素处理(element not visible)
使用WebDriver点击界面上被隐藏的元素时,使用默认的IWebElementClick()方法可能无法触发Click事件,这时的修改方案可以采用执行JS的方式来实现。
IWebElementwebElement = driverFindElement(ById(elementId));
IJavaScriptExecutorjs = driverasIJavaScriptExecutor;
jsExecuteScript("arguments[0]click();",webElement);
二、页面跳转后找不到元素(no such element)
页面跳转获取新页面的元素需要时间,所以需要在跳转后增加等待时间,最通用的方法是判断在某个时间内元素是否加载完成。
driverManage()Timeouts()ImplicitlyWait(TimeSpanFromSeconds(10));
三、屏蔽动画
如果网站使用了JQuery的动画效果,我们在运行测试的时候可以disable JQuery的animation,代码如下:
IJavaScriptExecutorjs = driverasIJavaScriptExecutor;
jsExecuteScript("jQueryfxoff=true");
四、不确定出现的元素处理
有的网站首次访问时会d出广告,第二次访问则不再显示,这种情况可以自己调用WebDriver的IsElementPresent(Byby)方法进行判断
if(IsElementPresent(Byby)))
{
driverFindElement(by)Click();
}
五、Cookie登录
自动化测试中,许多地方要求登录,cookie能够实现不必每次输入用户名和密码进行登录。
Cookiecookie =newCookie(name,value,domain,path,expires);
driverManage()CookiesAddCookie(cookie);
说明:参数分别为Cookie的名称,内容,域,路径,过期时间。
六、上传
参考:《Selenium(C#)实现上传的两种方式》
七、带placeholder属性的输入框Clear无效(invalid element state)
自动测试时,会出现某些带有默认值的输入框Clear()方法报错,错误提示:invalid element state: Element is not currently interactable and may not be manipulated,此时需要检查下输入文本框是否带有placeholder属性,如果有则直接略过Clear方法,原因如下:
placeholder定义和用法
placeholder属性提供可描述输入字段预期值的提示信息(hint)。
该提示会在输入字段为空时显示,并会在字段获得焦点时消失。
八、切换窗口
参考《WebDriver(C#)之窗口切换》
foreach(stringwinHandleindriverWindowHandles) //遍历当前打开的窗口
{
driverSwitchTo()Window(winHandle);
if(driverTitleContains(title)) //title是新窗口的Title
{
break;
}
}
九、Iframe元素定位
如果一个页面是一个html元素,只有一个head,一个body,使用driverFindElement()可以查找页面中任何一个元素。但是,页面中如果嵌入<frame…/>是的页面包含多个html元素,这种情况下就先要定位到元素所在的frame,然后再查找对应的元素,代码如下:
IWebElementframe = driverFindElement(ByXPath("//[@id='form1']/div[1]/div[1]/iframe"));
driverSwitchTo()Frame(frame);
十、Firefox代理设置
WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile,并不会使用当前Firefox的profile。所以如果要访问需要通过代理的web服务,直接设置Firefox的代理是没用的,因为WebDriver启动的Firefox不会使用该profile,需要在代码里设置FirefoxProfile属性,或者直接调用默认的profile。
publicIWebDriverProxyConfig()
{
FirefoxProfilefirefoxProfile =newFirefoxProfile();
firefoxProfileSetPreference("networkproxytype",1);
firefoxProfileSetPreference("networkproxy>
firefoxProfileSetPreference("networkproxy>
firefoxProfileSetPreference("networkproxyno_proxies_on","");
returnnewFirefoxDriver(firefoxProfile);
}
或者启动默认的profile
stringpath =@"C:\Users\username\AppData\Local\Mozilla\Firefox\Profiles\a8xlln4mdefault";
FirefoxProfileffprofile =newFirefoxProfile(path);
driver =newFirefoxDriver(ffprofile);
这个读不了网页元素,是因为你的网页都没有打开!它怎么去读取元素。建议用chrome来做这些页面 *** 作,会比较好用,没有这么多问题,IE和Firefox对这个webdriver支持不太好,会有很多问题!
尴尬,我在单页面里想要指定在某个页面上跳过viewapi的back事件,问题是没法判断当前在哪个页面,暂时是存在localstorage里,但这样做感觉不太好,
参考一下,也许可以帮助。
微信跳转至第三方网站不提示
1、首先打开自己的苹果手机,在手机桌面点击设置这个图标。
2、打开设置页面后,点击打开通用这个选项。
3、然后在打开的页面往下拉取页面,找到辅助功能这个选项并且点击打开。
4、进入辅助功能页面,再往下拉取界面,找到主屏幕按钮这个选项,并且点击打开。
5、然后在打开的页面,勾选慢选项。
6、退出设置,双击Home键试一下,如果还是会跳转到桌面,那么就再回到刚才第五步的页面,勾选最慢这个选项即可。
<html>
<script type="text/javascript"> //JS必须写在这个标签下,这个标签必须在HTML标签下
function test(but){ //函数必须有入参才能接收你传入的参数
var name= butname; //name属性是对象本身就有的属性,可以直接取。
alert(name);
}
</script>
<button type='button' onclick='test(this)' name='btn'>按钮</button>
</html>
<a>设置为空连接,然后点击执行Js,js延时windowlocationhref=就这个思路。试试,如果<a>空要跳转本页的话,你就写个<p>或者span成a的样式,点击后执行上面的js就行
以上就是关于appium 怎么跳转页面定位元素全部的内容,包括:appium 怎么跳转页面定位元素、WebDriver软件怎样使用、如何利用python的splinter框架控制当前测试页面的跳转页面上的元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)