元素选择不适用于混合应用程序,但在Appium中使用本机应用程序

时间:2018-06-02 04:05:19

标签: selenium selenium-webdriver appium appium-android

尝试使用资源ID

选择元素并添加点击事件

这是一个以离子开发的混合应用程序

ui automator selector

实际上这是一个标签

tab image

然后我写了这样的代码

package android;

import org.openqa.selenium.By;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class app { 

public static void main(String[] args) throws Exception
{

      File f= new File("src/123.apk");
      DesiredCapabilities capabilities = new DesiredCapabilities();
      capabilities.setCapability("deviceName", "Galaxy Nexus API 23");
      capabilities.setCapability(CapabilityType.BROWSER_NAME, "");

      capabilities.setCapability("platformName", "Android");
      capabilities.setCapability("unicodeKeyboard", "true");
      capabilities.setCapability("resetKeyboard", "true");
      capabilities.setCapability("newCommandTimeout", "45000");
      capabilities.setCapability("app", f.getAbsolutePath());

      RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); 

      driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

      driver.findElement(By.id("tab-t0-1")).click();

 }
 }

appium error log

我还添加了xpath方法

driver.findElement(By.xpath("//android.widget.TabWidget/android.view.View[1][@resource-id='tab-t0-1']")).click();

但显示没有找到元素错误,实际上相同的代码使用具有不同资源的本机应用程序 - id

这里有什么问题,请帮忙

1 个答案:

答案 0 :(得分:0)

您必须将上下文更改为混合模式:

private boolean changeContext(String context) {
    boolean changeFlag = false;
    if (StringUtils.containsIgnoreCase(context, "Native")) {
        context = "Native";
    } else if (StringUtils.containsIgnoreCase(context, "Hybrid")) {
        context = "WEBVIEW_com";
    }
    if (StringUtils.containsIgnoreCase(driver.getContext(), context)) return false;
    Set<String> contextName = driver.getContextHandles();
    for (String contexts : contextName) {
        if (StringUtils.containsIgnoreCase(contexts, context)) {
            driver.context(contexts);
            changeFlag = true;
            break;
        }
    }
    return changeFlag;
}