接下来要做的是与应用程序的不同元素进行交互,因此需要在交互之前首先定位元素。定位元素可以在AndroidDriver 实例本身上完成,因为它为我们提供了“ Find Element ”和“ Find Elements ”方法来定位Appium上的元素。在本章中,我们将学习如何使用FindElement和FindElements命令或如何使用具有不同属性的Appium UiAutomatorViewer / Appium Inspector定位元素。
如何在Appium中使用FindElement和FindElements方法
Find Element和Find Elements方法之间的区别是第一个返回WebElement对象,否则它会抛出异常而后者返回WebElements列表,如果没有DOM元素与查询匹配,它可以返回一个空列表。在查找方法采取定位器调用或查询对象通过。“ 按”策略列在下面。
按名字
这也是定位元素的有效方法,但问题与UI开发人员在页面上具有非唯一名称或自动生成名称的ID相同。使用此策略,将返回名称属性值与位置匹配的第一个元素。如果没有元素具有匹配的name属性,则将引发NoSuchElementException 。
示例1:如果给出的元素如下:
可以使用以下命令定位上述元素:
1 2 3 |
driver.findElement(By.name("Shop byDepartment")).click(); //or driver.findElementByName("Shop byDepartment").click(); |
示例2:如果给出的元素如下:
可以使用以下命令定位上述元素:
1 2 |
WebElement element = driver.findElement(By.name("Home")); element.click(); |
如何在Appium中使用' content-desc '属性查找元素?
content-desc属性可以与 findElementByName的text 属性完全一样使用。看下面的例子:
示例3:如果给出的元素如下:
可以使用以下命令定位上述元素:
1 |
driver.findElementByName("Sign inHello. Link").click(); |
按类名
有了这个,你可以根据class属性的值找到元素。如果一个元素有很多类,那么这将匹配它们中的每一个。一个类可以包含许多元素。
示例:如果给出的元素如下:
可以使用以下命令定位上述元素:
1 2 3 4 |
driver.findElementByClassName("android.widget.ImageView").click(); //or driver.findElement(By.className("android.widget.ImageView")).click(); |
注意:只有当这是一个唯一的类名时才能有效地工作,这在Appium中通常不是这种情况。但是我们仍然可以将 className与其他结合使用,我们将在下面给出一个详细的例子。
按ID
使用此策略,将返回id属性值与位置匹配的第一个元素。如果没有元素具有匹配的id属性,则将引发NoSuchElementException 。这是定位元素的最有效和首选方式,因为大多数时间ID都是唯一的。
示例:如果给出的元素如下:
可以使用以下命令定位上述元素:
1 2 3 4 5 6 |
WebElement element |