Java Appium:deviceName未找到android驱动程序,但已传递第一个可用的驱动程序
我有一些AVD设备在运行。 AVD ID:Pixel_3a_API_30_x86,Pixel_4_API_26 版本:8 然后我尝试执行一些自动测试,但首先我将使用以下类从运行的Appium服务器获取AndroidDriver 如果我设置了 能力。设置能力(“deviceName”、“Pixel_3a_API_30_x86”) 然后我从设备中获取第一个可用设备,而不是具有此deviceName的设备Java Appium:deviceName未找到android驱动程序,但已传递第一个可用的驱动程序,java,android,selenium,appium,Java,Android,Selenium,Appium,我有一些AVD设备在运行。 AVD ID:Pixel_3a_API_30_x86,Pixel_4_API_26 版本:8 然后我尝试执行一些自动测试,但首先我将使用以下类从运行的Appium服务器获取AndroidDriver 如果我设置了 能力。设置能力(“deviceName”、“Pixel_3a_API_30_x86”) 然后我从设备中获取第一个可用设备,而不是具有此deviceName的设备 package x.driver; import x.config.ConfigPropert
package x.driver;
import x.config.ConfigProperties;
import x.repository.testexec.AppiumAndroidUrlRepository;
import x.service.dto.testdef.DeviceDTO;
import x.service.impl.testexec.WindowsAndAndroidDriverPool;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import io.appium.java_client.remote.MobilePlatform;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class AndroidDriverFactory implements DriverFactory {
private static final Logger logger = LoggerFactory.getLogger(AndroidDriverFactory.class);
private final ConfigProperties configProperties;
private final DeviceDTO device;
private final String packageName;
private final String activity;
private final WindowsAndAndroidDriverPool windowsAndAndroidDriverPool;
private final List<String> usedUrls = new ArrayList<>();
private final AppiumAndroidUrlRepository appiumAndroidUrlRepository;
public AndroidDriverFactory(ConfigProperties configProperties, DeviceDTO device, String packageName,
String activity, WindowsAndAndroidDriverPool windowsAndAndroidDriverPool,
AppiumAndroidUrlRepository appiumAndroidUrlRepository) {
this.configProperties = configProperties;
this.device = device;
this.packageName = packageName;
this.activity = activity;
this.windowsAndAndroidDriverPool = windowsAndAndroidDriverPool;
this.appiumAndroidUrlRepository = appiumAndroidUrlRepository;
}
@Override
public WebDriver createDriver() throws InterruptedException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName", device.getSerial());
capabilities.setCapability("platformVersion", device.getOsVersion());
capabilities.setCapability("platformName", device.getType());
capabilities.setCapability("appPackage", packageName);
capabilities.setCapability("appActivity", activity);
//capabilities.setCapability("udid", "emulator-5556");
// capabilities.setCapability("noReset", true);
// capabilities.setCapability("autoGrantPermissions", true);
String remoteDriverHost = null;
String remoteDriverPort = null;
List<String> androidUrls = null;
if (this.device != null && device.getHost() != null && device.getPort() != null) {
remoteDriverHost = this.device.getHost();
remoteDriverPort = String.valueOf(this.device.getPort());
// if the host and port defined then need to run the test on the defined url
String remoteDriverUrl = "http://" + remoteDriverHost + ":" + remoteDriverPort + "/wd/hub";
androidUrls = new ArrayList<>();
androidUrls.add(remoteDriverUrl);
} else {
androidUrls = this.appiumAndroidUrlRepository.findAllByOrderByUrlOrder();
}
WebDriver driver = getOne(androidUrls, capabilities);
while (driver == null && !this.usedUrls.isEmpty()) {
this.windowsAndAndroidDriverPool.waitForDependsOnTask(this.usedUrls.get(0));
driver = getOne(androidUrls, capabilities);
}
if (driver != null) {
return driver;
}
throw new IllegalArgumentException("No active Appium android remote driver found: " + androidUrls);
}
private WebDriver getOne(final List<String> androidUrls, final Capabilities capabilities) {
this.usedUrls.clear();
synchronized (this.getClass()) {
for (String url : androidUrls) {
if (!this.windowsAndAndroidDriverPool.isRemoteDriverUrlUsed(url)) {
WebDriver driver = getAndroidDriverAndUse(url, capabilities);
if (driver != null) {
return driver;
}
} else {
this.usedUrls.add(url);
}
}
}
return null;
}
private WebDriver getAndroidDriverAndUse(final String url, final Capabilities capabilities) {
try {
WebDriver driver = getAndroidDriver(url, capabilities);
this.windowsAndAndroidDriverPool.useRemoteDriverUrl(url);
return driver;
} catch (Exception e) {
logger.info(e.getMessage());
}
return null;
}
private WebDriver getAndroidDriver(final String remoteDriverUrl, final Capabilities capabilities) {
try {
return new AndroidDriver<>(new URL(remoteDriverUrl), capabilities);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Wrong Appium url!", e);
} catch (WebDriverException e) {
logger.info(e.getMessage());
throw new RuntimeException("Android remote driver is not available!", e);
}
}
}
appium的答复:
[io.appium.java_client.android.AndroidDriver, Capabilities: {appActivity=com.android.calculator2.Calculator, appPackage=com.android.calculator2, browserName=, databaseEnabled=false, desired={browserName=, platformName=android, appActivity=com.android.calculator2.Calculator, appPackage=com.android.calculator2, deviceName=Pixel_3a_API_30_x86, platformVersion=8}, deviceApiLevel=26, deviceManufacturer=Google, deviceModel=Android SDK built for x86, deviceName=emulator-5554, deviceScreenDensity=440, deviceScreenSize=1080x2160, deviceUDID=emulator-5554, javascriptEnabled=true, locationContextEnabled=false, networkConnectionEnabled=true, pixelRatio=2.75, platform=LINUX, platformName=ANDROID, platformVersion=8.0.0, statBarHeight=66, takesScreenshot=true, viewportRect={left=0, top=66, width=1080, height=1962}, warnings={}, webStorageEnabled=false}]
正如你所看到的,我试图在Cap中传递UDID,当我这样做时,我得到了正确的设备,但它无法解决问题
[io.appium.java_client.android.AndroidDriver, Capabilities: {appActivity=com.android.calculator2.Calculator, appPackage=com.android.calculator2, browserName=, databaseEnabled=false, desired={browserName=, platformName=android, appActivity=com.android.calculator2.Calculator, appPackage=com.android.calculator2, deviceName=Pixel_3a_API_30_x86, platformVersion=8}, deviceApiLevel=26, deviceManufacturer=Google, deviceModel=Android SDK built for x86, deviceName=emulator-5554, deviceScreenDensity=440, deviceScreenSize=1080x2160, deviceUDID=emulator-5554, javascriptEnabled=true, locationContextEnabled=false, networkConnectionEnabled=true, pixelRatio=2.75, platform=LINUX, platformName=ANDROID, platformVersion=8.0.0, statBarHeight=66, takesScreenshot=true, viewportRect={left=0, top=66, width=1080, height=1962}, warnings={}, webStorageEnabled=false}]