Appium 【已解决】IOS 中 UIATableView 获取所有 UIATableCell 子节点问题

ellison · 2014年11月05日 · 最后由 王艳峰 回复于 2016年06月07日 · 1594 次阅读

语言:java
环境:appium1.2.0
模拟 ios7.1
想通过 findElements 获取到 UIATableView 的所有 UIATableCell 子节点
"//UIAApplication[1]/UIAWindow[1]/UIATableView[2]"是 UIATableView 对应的 xpath;

UIATableView 的一个 UIATableCell 子节点信息如下:
name: ZCTab_多页面 tab , 24, 35
type: UIATableCell
value:
label:
enabled: true
visible: false
valid: true
location: {0, 278}
size: {320, 75}
xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[2]/UIATableCell[1]

请大侠帮忙看为什么取出来的 list 是空呢?

代码如下

WebElement wd =                 driver.findElementByXPath("//UIAApplication[1]/UIAWindow[1]/UIATableView[2]");

List<WebElement> wbList= wd.findElements(By.xpath("./UIATableCell"));
int i =0;
for(WebElement tt:wbList){

    System.out.println("--------"+i+"---------");
    System.out.println(tt.getSize());
    System.out.println(tt.getLocation());
    System.out.println(tt.getAttribute("name"));
    System.out.println(tt.getAttribute("label"));
    System.out.println(tt.getAttribute("value"));
    System.out.println(tt);
    System.out.println("--------"+i+"---------");
    i++;
}

共收到 14 条回复 时间 点赞
15楼 已删除

@gigayaya
非常感谢你的回答。
最终目的确实是 “UIATableCell“底下” 每一個元素,而不是每一個 UIATableCell”;现在的问题就是不知道这一句该如何写。

List<WebElement> wbList= wd.findElements(By.xpath("./UIATableCell"));

网上查找了 xpath 的一些说明;感觉"./UIATableCell"的写法是正确的;现在确实糊涂了;暂时还没搞明白如何处理。
XPath 上下文基本有以下几种:

当前节点 (./):
如./sender 表示选择当前节点下的 sender 节点集合(等同于下面所讲的"特定元素",如:sender)

父节点 (../):
如../sender 表示选择当前节点的父节点下的 sender 节点集合

根元素(/):
如/messages 表示选择从文档根节点下的 messages 节点集合.

#2 楼 @ellison uiautomation 的 xpath 是要从 root 节点开始的。 ./ 这种不认的。

#3 楼 @lihuazhang
IOS 中通过一个 UIATableView 获取到到它的所有 UIATableCell 子节点应该如何处理呢?
我试了

List<WebElement> wbList= wd.findElements(By.className("UIATableCell"));

也不行

剛剛腦衝看錯了,下午開完會回來繼續
爬了一下文發現,原來 classname 在 ios 會自動轉成 type

如果我的目標是這裡:
xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/UIATableCell[6]/UIASwitch[1]

那 code 應該是這樣:

WebElement aa = wd.findElement(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIATableView[1]"));
List<WebElement> wblist= aa.findElements(By.className("UIATableCell"));
WebElement bb = wblist.get(5);
WebElement cc = bb.findElement(By.className("UIASwitch"));

cc.click();

xpath 跟 index 不一樣,xpath 從1開始,index 從0開始算
我的 appium 是 1.3.0-beta1 iOS 8.0

#5 楼 @gigayaya
囧~~看我 4 楼的回复。为什么我之前试不行;现在又可以了。
多谢 gigayaya
可以结贴了。
但是还是有应该问题还想咨询下你;如果想获取 UIATableView 下面的所有子节点(子节点类型不一致,比如 UIATableCell、UIATableGroup);
我想如果要实现上面的功能;似乎还是只能通过 xpath。
gigayaya,你怎么看?

試出來了~

code:

List<WebElement> wblist= wd.findElements(By.xpath("//UIAApplication[1]/UIAWindow[1]/UIATableView[1]/*"));
System.out.println(wblist);

output:

[[[AppiumDriver: iOS on MAC (] -> xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/*], [[AppiumDriver: iOS on MAC ()] -> xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/*], [[AppiumDriver: iOS on MAC ()] -> xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/*], [[AppiumDriver: iOS on MAC ()] -> xpath: //UIAApplication[1]/UIAWindow[1]/UIATableView[1]/*]]

可是好像看不到元素的類別,只知道有幾個元素

#7 楼 @gigayaya
好像 xpath 只能从根节点开始取,晚上回家再研究下。非常感谢 gigayaya。

所謂定位,一定先有一個點,再從這個點往其他方向找,就像一定要有兩點才能成為一直線。
所以你要找某個東西,一定是先從一個你可以確認的位置再開始往旁邊找。
例如:driver.findElement() 就是從這個 app 最上層開始往下找。雖然不知道你想要什麼功能,不過我想從根節點開始定位應該不是什麼問題。

#9 楼 @gigayaya
嗯~非常感谢。
我看你之前回复的帖子;你也是用 “Java+JUnit+Ant+Jenkins” 来管理和执行 case 的。
我们的项目刚开始也计划这样来搞;现在才刚开始;希望可以多交流。

#8 楼 @ellison 都不感谢我。。。失落了。

#11 楼 @lihuazhang 哎呀,不小心把你忘了。不好意思啊。必须感谢你;让我知道 “uiautomation 的 xpath 是要从 root 节点开始的”。

#12 楼 @ellison
我也剛開始摸哈哈。平常在群裡可以找到我

学习了,感谢

#10 楼 @ellison ant debut 的时候报这个错,请问你遇到过吗?
[dx]
[dx] UNEXPECTED TOP-LEVEL ERROR:
[dx] java.lang.OutOfMemoryError: GC overhead limit exceeded
[dx] at java.util.Arrays.copyOfRange(Arrays.java:3664)
[dx] at java.lang.String.(String.java:207)
[dx] at com.android.dx.rop.cst.CstString.utf8BytesToString(CstString.
java:158)
[dx] at com.android.dx.rop.cst.CstString.(CstString.java:200)
[dx] at com.android.dx.cf.cst.ConstantPoolParser.parseUtf8(ConstantPo
olParser.java:371)
[dx] at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolP
arser.java:262)
[dx] at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolPa
rser.java:150)
[dx] at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(Con
stantPoolParser.java:124)
[dx] at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPool
Parser.java:115)
[dx] at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFi
le.java:482)
[dx] at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFil
e.java:406)
[dx] at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfN
ecessary(DirectClassFile.java:388)
[dx] at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClass
File.java:251)
[dx] at com.android.dx.command.dexer.Main.processClass(Main.java:665)

[dx] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:
634)
[dx] at com.android.dx.command.dexer.Main.access$600(Main.java:78)
[dx] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.jav
a:572)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processArchive(Class
PathOpener.java:284)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPath
Opener.java:166)
[dx] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpe
ner.java:144)
[dx] at com.android.dx.command.dexer.Main.processOne(Main.java:596)
[dx] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:4
98)
[dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
[dx] at com.android.dx.command.dexer.Main.run(Main.java:230)
[dx] at com.android.dx.command.dexer.Main.main(Main.java:199)
[dx] at com.android.dx.command.Main.main(Main.java:103)

BUILD FAILED
D:\wyf\tools\Android\ADT-64\ADT\sdk\tools\ant\build.xml:888: The following error
occurred while executing this line:
D:\wyf\tools\Android\ADT-64\ADT\sdk\tools\ant\build.xml:890: The following error
occurred while executing this line:
D:\wyf\tools\Android\ADT-64\ADT\sdk\tools\ant\build.xml:902: The following error
occurred while executing this line:
D:\wyf\tools\Android\ADT-64\ADT\sdk\tools\ant\build.xml:283: null returned: 3

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册