testing - 等待元素出现或可点击
问题描述
我在尝试测试的应用程序上等待元素时遇到问题。有时 Appium 无法定位元素。
这是我的 BaseTests 课程
package Base;
import helpers.TestValues;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
public class BaseTests {
protected AndroidDriver<AndroidElement> driver;
@BeforeMethod
public void setup () throws MalformedURLException {
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("deviceName", TestValues.devicesInfo.Honor10);
caps.setCapability("platformName", TestValues.devicesInfo.PlatformName);
caps.setCapability("platformVersion", TestValues.devicesInfo.Android810Version);
caps.setCapability("skipUnlock", TestValues.devicesInfo.SkipUnlock);
caps.setCapability("appPackage", TestValues.devicesInfo.AppPackageWageName);
caps.setCapability("appActivity", TestValues.devicesInfo.AppPackageWageActivity);
caps.setCapability("noReset","false");
driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"),caps);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
@AfterMethod
public void teardown(){
driver.quit();
}
}
这是带有页面对象的 MainPage 类
package PageObjects;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.openqa.selenium.support.PageFactory;
public class MainPage {
private AndroidDriver<AndroidElement> driver;
public MainPage(AndroidDriver<AndroidElement> driver) {
this.driver = driver;
PageFactory.initElements(new AppiumFieldDecorator(driver) ,this);
}
@AndroidFindBy(id = "add_task_button")
private AndroidElement AddTaskButton;
@AndroidFindBy(id = "com.android.packageinstaller:id/permission_allow_button")
private AndroidElement PermissionAllowButton;
public void ClickOnAllowButton(){
PermissionAllowButton.click();
}
public boolean IsAddTaskVisible(){
return AddTaskButton.isDisplayed();
}
public void ClickOnAddTaskButton() {
AddTaskButton.click();
}
}
和测试
@Test
public void PostTask (){
_landingPage.clickOnLoginButton();
_loginPage.TypeEmail(TestValues.Credentials.CorrectEmail);
_loginPage.TypePassword(TestValues.Credentials.CorrectPassword);
_loginPage.ClickOnLoginBUtton();
_mainPage.ClickOnAllowButton();
//here is loading spinner because app fetch data from API
_mainPage.ClickOnAddTaskButton();
_mainPage.ClickOnAllowButton();
_postTaskPage.SendPhoto();
}
在大多数情况下,我的测试在单击添加任务按钮时失败,即使加载微调器消失 Appium 尝试找到它,因为我在控制台中看到
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {“cmd”:“action”,“action”:“find”,“params”:{“strategy”:“id”,“selector”:“add_task_button”,“context”:"",“multiple”:false}}
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: find
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Finding 'add_task_button' using 'ID' with the contextId: '' multiple: false
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=io.wageapp.android:id/add_task_button]
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=android:id/add_task_button]
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=add_task_button]
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[DESCRIPTION=add_task_button, INSTANCE=0]
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Failed to locate element. Clearing Accessibility cache and retrying.
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Finding 'add_task_button' using 'ID' wi
但大多数情况下它会因错误而失败
org.openqa.selenium.NoSuchElementException: Can’t locate an element by this strategy: By.chained({By.id: add_task_button})
但是 id 是正确的(有时它会成功定位) https://i.postimg.cc/KjVYPnQF/2019-12-04-12-52-38-Appium.png 我做错了什么?以及我应该如何正确处理“等待”以使我的测试能够抵抗这种情况。
提前致谢
解决方案
xpath
首先:当您能够找到具有其他属性的元素时不要使用。在您的特定情况下,您可以通过调用找到您的元素driver.findElementByAccessibilityId("Add offer");
其次:如果您不想获取NoSuchElementException
,请确保该元素在页面中。对于这种情况,您可以使用!driver.findElementsByAccessibilityId("Add offer").isEmpty();
,如果它返回true
,则查找获取此元素。
注意:该方法名称是findElement
sByAccessibilityId
并且它返回List<T>
。
第三:确保你的元素有对应的属性,比如vivsible
等clickable
(根据你的需要)
推荐阅读
- powerbi - Power Bi 预测日期范围内跨天/月的预计销售额
- node.js - Node.js 中的并发出站 HTTP 请求使响应变慢
- python - Python:在 Matplotlib 动画中添加动态文本
- python - 有没有办法直接在运行 Selenium 的 Python 脚本上使用 Torsocks?
- java - Java:我可以在外部类中创建内部类的变量类型吗?
- c - 未设置 SA_SIGINFO 时使用带有 sigaction 的 sigaction 处理程序
- python - Discord.py 向自定义 ID 用户发送 DM
- python - 致命的 Python 错误:initsite:导入站点模块失败
- python - 嵌入字段中的 Discord Python Bot 多值
- r - 带有多个标签ggplot2的条形图