diff --git a/build.gradle b/build.gradle index 9886b625a..0bf587047 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ compileJava { } dependencies { - compile('org.seleniumhq.selenium:selenium-java:3.2.0'){ + compile('org.seleniumhq.selenium:selenium-java:3.3.1'){ exclude module: 'cglib' exclude group: 'com.google.code.gson' } diff --git a/src/main/java/io/appium/java_client/AppiumCommandInfo.java b/src/main/java/io/appium/java_client/AppiumCommandInfo.java new file mode 100644 index 000000000..7c6d0d43f --- /dev/null +++ b/src/main/java/io/appium/java_client/AppiumCommandInfo.java @@ -0,0 +1,45 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.appium.java_client; + +import org.openqa.selenium.remote.CommandInfo; +import org.openqa.selenium.remote.http.HttpMethod; + +public class AppiumCommandInfo extends CommandInfo { + private final String url; + private final HttpMethod method; + + /** + * It conntains method and URL of the command. + * + * @param url command URL + * @param method is http-method + */ + public AppiumCommandInfo(String url, HttpMethod method) { + super(url, method); + this.url = url; + this.method = method; + } + + public String getUrl() { + return url; + } + + public HttpMethod getMethod() { + return method; + } +} diff --git a/src/main/java/io/appium/java_client/AppiumDriver.java b/src/main/java/io/appium/java_client/AppiumDriver.java index fa9696cfe..1cd9219af 100644 --- a/src/main/java/io/appium/java_client/AppiumDriver.java +++ b/src/main/java/io/appium/java_client/AppiumDriver.java @@ -44,7 +44,6 @@ import org.openqa.selenium.remote.DriverCommand; import org.openqa.selenium.remote.ErrorHandler; import org.openqa.selenium.remote.ExecuteMethod; -import org.openqa.selenium.remote.HttpCommandExecutor; import org.openqa.selenium.remote.Response; import org.openqa.selenium.remote.html5.RemoteLocationContext; import org.openqa.selenium.remote.http.HttpClient; @@ -85,7 +84,7 @@ public class AppiumDriver * @param capabilities take a look * at {@link org.openqa.selenium.Capabilities} */ - public AppiumDriver(HttpCommandExecutor executor, Capabilities capabilities) { + public AppiumDriver(AppiumCommandExecutor executor, Capabilities capabilities) { super(executor, capabilities); this.executeMethod = new AppiumExecutionMethod(this); locationContext = new RemoteLocationContext(executeMethod); diff --git a/src/main/java/io/appium/java_client/MobileCommand.java b/src/main/java/io/appium/java_client/MobileCommand.java index ed0a530fd..ce4e75e3c 100644 --- a/src/main/java/io/appium/java_client/MobileCommand.java +++ b/src/main/java/io/appium/java_client/MobileCommand.java @@ -19,7 +19,6 @@ import com.google.common.collect.ImmutableMap; import org.apache.commons.lang3.StringUtils; -import org.openqa.selenium.remote.CommandInfo; import org.openqa.selenium.remote.http.HttpMethod; import java.util.AbstractMap; @@ -77,7 +76,7 @@ public class MobileCommand { protected static final String GET_SETTINGS; protected static final String SET_SETTINGS; - public static final Map commandRepository; + public static final Map commandRepository; static { RESET = "reset"; @@ -184,8 +183,8 @@ public class MobileCommand { * @param url is the command URL * @return an instance of {@link org.openqa.selenium.remote.CommandInfo} */ - public static CommandInfo getC(String url) { - return new CommandInfo(url, HttpMethod.GET); + public static AppiumCommandInfo getC(String url) { + return new AppiumCommandInfo(url, HttpMethod.GET); } /** @@ -194,8 +193,8 @@ public static CommandInfo getC(String url) { * @param url is the command URL * @return an instance of {@link org.openqa.selenium.remote.CommandInfo} */ - public static CommandInfo postC(String url) { - return new CommandInfo(url, HttpMethod.POST); + public static AppiumCommandInfo postC(String url) { + return new AppiumCommandInfo(url, HttpMethod.POST); } /** @@ -204,8 +203,8 @@ public static CommandInfo postC(String url) { * @param url is the command URL * @return an instance of {@link org.openqa.selenium.remote.CommandInfo} */ - public static CommandInfo deleteC(String url) { - return new CommandInfo(url, HttpMethod.DELETE); + public static AppiumCommandInfo deleteC(String url) { + return new AppiumCommandInfo(url, HttpMethod.DELETE); } /** diff --git a/src/main/java/io/appium/java_client/android/AndroidDriver.java b/src/main/java/io/appium/java_client/android/AndroidDriver.java index 0b8b8497f..7913ec52c 100644 --- a/src/main/java/io/appium/java_client/android/AndroidDriver.java +++ b/src/main/java/io/appium/java_client/android/AndroidDriver.java @@ -25,12 +25,12 @@ import io.appium.java_client.FindsByAndroidUIAutomator; import io.appium.java_client.PressesKeyCode; import io.appium.java_client.TouchAction; +import io.appium.java_client.remote.AppiumCommandExecutor; import io.appium.java_client.remote.MobilePlatform; import io.appium.java_client.service.local.AppiumDriverLocalService; import io.appium.java_client.service.local.AppiumServiceBuilder; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.HttpCommandExecutor; import org.openqa.selenium.remote.http.HttpClient; import java.net.URL; @@ -59,7 +59,7 @@ public class AndroidDriver * @param capabilities take a look * at {@link org.openqa.selenium.Capabilities} */ - public AndroidDriver(HttpCommandExecutor executor, Capabilities capabilities) { + public AndroidDriver(AppiumCommandExecutor executor, Capabilities capabilities) { super(executor, substituteMobilePlatform(capabilities, ANDROID_PLATFORM)); } diff --git a/src/main/java/io/appium/java_client/ios/IOSDriver.java b/src/main/java/io/appium/java_client/ios/IOSDriver.java index ce71c5591..a1649106c 100644 --- a/src/main/java/io/appium/java_client/ios/IOSDriver.java +++ b/src/main/java/io/appium/java_client/ios/IOSDriver.java @@ -23,6 +23,7 @@ import io.appium.java_client.FindsByIosUIAutomation; import io.appium.java_client.HidesKeyboardWithKeyName; import io.appium.java_client.TouchAction; +import io.appium.java_client.remote.AppiumCommandExecutor; import io.appium.java_client.remote.MobilePlatform; import io.appium.java_client.service.local.AppiumDriverLocalService; import io.appium.java_client.service.local.AppiumServiceBuilder; @@ -30,7 +31,6 @@ import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DriverCommand; -import org.openqa.selenium.remote.HttpCommandExecutor; import org.openqa.selenium.remote.Response; import org.openqa.selenium.remote.http.HttpClient; import org.openqa.selenium.security.Credentials; @@ -61,7 +61,7 @@ public class IOSDriver * @param capabilities take a look * at {@link org.openqa.selenium.Capabilities} */ - public IOSDriver(HttpCommandExecutor executor, Capabilities capabilities) { + public IOSDriver(AppiumCommandExecutor executor, Capabilities capabilities) { super(executor, substituteMobilePlatform(capabilities, IOS_PLATFORM)); } diff --git a/src/main/java/io/appium/java_client/remote/AndroidMobileCapabilityType.java b/src/main/java/io/appium/java_client/remote/AndroidMobileCapabilityType.java index 0e8b04baa..60cf95db5 100644 --- a/src/main/java/io/appium/java_client/remote/AndroidMobileCapabilityType.java +++ b/src/main/java/io/appium/java_client/remote/AndroidMobileCapabilityType.java @@ -241,7 +241,7 @@ public interface AndroidMobileCapabilityType extends CapabilityType { String SELENDROID_PORT = "selendroidPort"; /** - * The port number, which being used by UIAutomator2 + * The port number, which being used by UIAutomator2. */ String SYSTEM_PORT = "systemPort"; } diff --git a/src/main/java/io/appium/java_client/remote/AppiumCommandExecutor.java b/src/main/java/io/appium/java_client/remote/AppiumCommandExecutor.java index ba3414913..18a928fa8 100644 --- a/src/main/java/io/appium/java_client/remote/AppiumCommandExecutor.java +++ b/src/main/java/io/appium/java_client/remote/AppiumCommandExecutor.java @@ -16,16 +16,29 @@ package io.appium.java_client.remote; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Throwables.getRootCause; +import static com.google.common.base.Throwables.throwIfUnchecked; +import static org.openqa.selenium.remote.DriverCommand.GET_ALL_SESSIONS; +import static org.openqa.selenium.remote.DriverCommand.NEW_SESSION; +import static org.openqa.selenium.remote.DriverCommand.QUIT; -import com.google.common.base.Throwables; - +import io.appium.java_client.AppiumCommandInfo; +import org.openqa.selenium.NoSuchSessionException; +import org.openqa.selenium.SessionNotCreatedException; +import org.openqa.selenium.UnsupportedCommandException; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.remote.Command; -import org.openqa.selenium.remote.CommandInfo; +import org.openqa.selenium.remote.CommandCodec; +import org.openqa.selenium.remote.CommandExecutor; +import org.openqa.selenium.remote.Dialect; import org.openqa.selenium.remote.DriverCommand; -import org.openqa.selenium.remote.HttpCommandExecutor; +import org.openqa.selenium.remote.HttpSessionId; import org.openqa.selenium.remote.Response; +import org.openqa.selenium.remote.ResponseCodec; import org.openqa.selenium.remote.http.HttpClient; +import org.openqa.selenium.remote.http.HttpRequest; +import org.openqa.selenium.remote.http.HttpResponse; import org.openqa.selenium.remote.internal.ApacheHttpClient; import org.openqa.selenium.remote.service.DriverService; @@ -34,41 +47,121 @@ import java.net.URL; import java.util.Map; -public class AppiumCommandExecutor extends HttpCommandExecutor { +public class AppiumCommandExecutor implements CommandExecutor { - private final DriverService service; + private final URL remoteServer; + private final HttpClient client; + private final Map additionalCommands; + private CommandCodec commandCodec; + private ResponseCodec responseCodec; + private DriverService service; - public AppiumCommandExecutor(Map additionalCommands, + /** + * Cretes an instance that sends requests and receives responses. + * + * @param additionalCommands is the mapped command repository + * @param addressOfRemoteServer is the url to connect to the Appium remote/local server + * @param httpClientFactory is the http client factory + */ + public AppiumCommandExecutor(Map additionalCommands, URL addressOfRemoteServer, HttpClient.Factory httpClientFactory) { - super(additionalCommands, addressOfRemoteServer, httpClientFactory); - service = null; + checkNotNull(addressOfRemoteServer); + remoteServer = addressOfRemoteServer; + this.additionalCommands = additionalCommands; + this.client = httpClientFactory.createClient(remoteServer); } - public AppiumCommandExecutor(Map additionalCommands, DriverService service, + public AppiumCommandExecutor(Map additionalCommands, DriverService service, HttpClient.Factory httpClientFactory) { - super(additionalCommands, service.getUrl(), httpClientFactory); + this(additionalCommands, service.getUrl(), httpClientFactory); this.service = service; } - public AppiumCommandExecutor(Map additionalCommands, + public AppiumCommandExecutor(Map additionalCommands, URL addressOfRemoteServer) { this(additionalCommands, addressOfRemoteServer, new ApacheHttpClient.Factory()); } - public AppiumCommandExecutor(Map additionalCommands, + public AppiumCommandExecutor(Map additionalCommands, DriverService service) { this(additionalCommands, service, new ApacheHttpClient.Factory()); } + public URL getAddressOfRemoteServer() { + return remoteServer; + } + + private Response doExecute(Command command) throws IOException, WebDriverException { + if (command.getSessionId() == null) { + if (QUIT.equals(command.getName())) { + return new Response(); + } + if (!GET_ALL_SESSIONS.equals(command.getName()) + && !NEW_SESSION.equals(command.getName())) { + throw new NoSuchSessionException( + "Session ID is null. Using WebDriver after calling quit()?"); + } + } + + if (NEW_SESSION.equals(command.getName())) { + if (commandCodec != null) { + throw new SessionNotCreatedException("Session already exists"); + } + AppiumProtocolHandShake handshake = new AppiumProtocolHandShake(); + AppiumProtocolHandShake.Result result = handshake.createSession(client, command); + Dialect dialect = result.getDialect(); + commandCodec = dialect.getCommandCodec(); + + additionalCommands.forEach((key, value) -> { + checkNotNull(key); + checkNotNull(value); + commandCodec.defineCommand(key, value.getMethod(), value.getUrl()); + } ); + + responseCodec = dialect.getResponseCodec(); + return result.createResponse(); + } + + if (commandCodec == null || responseCodec == null) { + throw new WebDriverException( + "No command or response codec has been defined. Unable to proceed"); + } + + HttpRequest httpRequest = commandCodec.encode(command); + try { + HttpResponse httpResponse = client.execute(httpRequest, true); + + Response response = responseCodec.decode(httpResponse); + if (response.getSessionId() == null) { + if (httpResponse.getTargetHost() != null) { + response.setSessionId(HttpSessionId.getSessionId(httpResponse.getTargetHost())); + } else { + response.setSessionId(command.getSessionId().toString()); + } + } + if (QUIT.equals(command.getName())) { + client.close(); + } + return response; + } catch (UnsupportedCommandException e) { + if (e.getMessage() == null || "".equals(e.getMessage())) { + throw new UnsupportedOperationException( + "No information from server. Command name was: " + command.getName(), + e.getCause()); + } + throw e; + } + } + @Override public Response execute(Command command) throws IOException, WebDriverException { if (DriverCommand.NEW_SESSION.equals(command.getName()) && service != null) { service.start(); } try { - return super.execute(command); + return doExecute(command); } catch (Throwable t) { - Throwable rootCause = Throwables.getRootCause(t); + Throwable rootCause = getRootCause(t); if (rootCause instanceof ConnectException && rootCause.getMessage().contains("Connection refused") && service != null) { @@ -80,7 +173,7 @@ public AppiumCommandExecutor(Map additionalCommands, throw new WebDriverException("The appium server has accidentally died!", t); } } - Throwables.propagateIfPossible(t); + throwIfUnchecked(t); throw new WebDriverException(t); } finally { if (DriverCommand.QUIT.equals(command.getName()) && service != null) { diff --git a/src/main/java/io/appium/java_client/remote/AppiumProtocolHandShake.java b/src/main/java/io/appium/java_client/remote/AppiumProtocolHandShake.java new file mode 100644 index 000000000..58771a138 --- /dev/null +++ b/src/main/java/io/appium/java_client/remote/AppiumProtocolHandShake.java @@ -0,0 +1,216 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.appium.java_client.remote; + +import static com.google.common.base.Charsets.UTF_8; +import static com.google.common.net.HttpHeaders.CONTENT_LENGTH; +import static com.google.common.net.HttpHeaders.CONTENT_TYPE; +import static com.google.common.net.MediaType.JSON_UTF_8; +import static java.util.Optional.ofNullable; +import static org.openqa.selenium.remote.ErrorCodes.SESSION_NOT_CREATED; +import static org.openqa.selenium.remote.ErrorCodes.SUCCESS; + +import com.google.common.base.Preconditions; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.openqa.selenium.Capabilities; +import org.openqa.selenium.SessionNotCreatedException; +import org.openqa.selenium.WebDriverException; +import org.openqa.selenium.remote.BeanToJsonConverter; +import org.openqa.selenium.remote.Command; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.Dialect; +import org.openqa.selenium.remote.ErrorHandler; +import org.openqa.selenium.remote.JsonException; +import org.openqa.selenium.remote.JsonToBeanConverter; +import org.openqa.selenium.remote.Response; +import org.openqa.selenium.remote.SessionId; +import org.openqa.selenium.remote.http.HttpClient; +import org.openqa.selenium.remote.http.HttpMethod; +import org.openqa.selenium.remote.http.HttpRequest; +import org.openqa.selenium.remote.http.HttpResponse; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +class AppiumProtocolHandShake { + + public Result createSession(HttpClient client, Command command) + throws IOException, WebDriverException { + + Capabilities desired = ofNullable((Capabilities) command.getParameters().get("desiredCapabilities")) + .orElseGet(DesiredCapabilities::new); + + Capabilities required = ofNullable((Capabilities) command.getParameters().get("requiredCapabilities")) + .orElseGet(DesiredCapabilities::new); + + JsonParser parser = new JsonParser(); + JsonElement des = parser.parse(new BeanToJsonConverter().convert(desired)); + JsonElement req = parser.parse(new BeanToJsonConverter().convert(required)); + + JsonObject jsonObject = new JsonObject(); + + amendW3CParameters(jsonObject, des, req); + amendOssParamters(jsonObject, des, req); + Optional result = createSession(client, jsonObject); + + return ofNullable(result.orElseGet(() -> { + JsonObject jsonObject1 = new JsonObject(); + amendOssParamters(jsonObject1, des, req); + + try { + return createSession(client, jsonObject1).orElseGet(() -> { + JsonObject jsonObject2 = new JsonObject(); + amendW3CParameters(jsonObject2, des, req); + + try { + return createSession(client, jsonObject2).orElse(null); + } catch (IOException e) { + throw new WebDriverException(e); + } + }); + } catch (IOException e) { + throw new WebDriverException(e); + } + })).orElseThrow(() -> new SessionNotCreatedException( + String.format( + "Unable to create new remote session. " + + "desired capabilities = %s, required capabilities = %s", + desired, + required))); + } + + private Optional createSession(HttpClient client, JsonObject params) + throws IOException { + // Create the http request and send it + HttpRequest request = new HttpRequest(HttpMethod.POST, "/session"); + String content = params.toString(); + byte[] data = content.getBytes(UTF_8); + + request.setHeader(CONTENT_LENGTH, String.valueOf(data.length)); + request.setHeader(CONTENT_TYPE, JSON_UTF_8.toString()); + request.setContent(data); + HttpResponse response = client.execute(request, true); + + Map jsonBlob = new HashMap<>(); + String resultString = response.getContentString(); + try { + jsonBlob = new JsonToBeanConverter().convert(Map.class, resultString); + } catch (ClassCastException e) { + return Optional.empty(); + } catch (JsonException e) { + // Fine. Handle that below + } + + // If the result looks positive, return the result. + Object sessionId = jsonBlob.get("sessionId"); + Object value = jsonBlob.get("value"); + Object w3cError = jsonBlob.get("error"); + Object ossStatus = jsonBlob.get("status"); + Map capabilities = null; + if (value != null && value instanceof Map) { + capabilities = (Map) value; + } else if (value != null && value instanceof Capabilities) { + capabilities = ((Capabilities) capabilities).asMap(); + } + + if (response.getStatus() == HttpURLConnection.HTTP_OK + && sessionId != null && capabilities != null) { + Dialect dialect = ossStatus == null ? Dialect.W3C : Dialect.OSS; + return Optional.of( + new Result(dialect, String.valueOf(sessionId), capabilities)); + } + + // If the result was an error that we believe has to do with the remote end failing to start the + // session, create an exception and throw it. + Response tempResponse = null; + if ("session not created".equals(w3cError)) { + tempResponse = new Response(null); + tempResponse.setStatus(SESSION_NOT_CREATED); + tempResponse.setValue(jsonBlob); + } else if ( + ossStatus instanceof Number + && ((Number) ossStatus).intValue() == SESSION_NOT_CREATED) { + tempResponse = new Response(null); + tempResponse.setStatus(SESSION_NOT_CREATED); + tempResponse.setValue(jsonBlob); + } + + if (tempResponse != null) { + new ErrorHandler().throwIfResponseFailed(tempResponse, 0); + } + + // Otherwise, just return empty. + return Optional.empty(); + } + + private void amendW3CParameters(JsonObject jsonObject, JsonElement desired, + JsonElement required) { + JsonArray result = new JsonArray(); + JsonObject desiredJson = new JsonObject(); + JsonObject requiredJson = new JsonObject(); + + desiredJson.add("desiredCapabilities", desired); + requiredJson.add("requiredCapabilities", required); + + result.add(desiredJson); + result.add(requiredJson); + + jsonObject.add("capabilities", result); + } + + private void amendOssParamters( + JsonObject jsonObject, JsonElement desired, + JsonElement required) { + jsonObject.add("desiredCapabilities", desired); + jsonObject.add("requiredCapabilities", required); + } + + public class Result { + private final Dialect dialect; + private final Map capabilities; + private final SessionId sessionId; + + private Result(Dialect dialect, String sessionId, Map capabilities) { + this.dialect = dialect; + this.sessionId = new SessionId(Preconditions.checkNotNull(sessionId)); + this.capabilities = capabilities; + } + + public Dialect getDialect() { + return dialect; + } + + public Response createResponse() { + Response response = new Response(sessionId); + response.setValue(capabilities); + response.setStatus(SUCCESS); + return response; + } + + @Override + public String toString() { + return String.format("%s: %s", dialect, capabilities); + } + } +} diff --git a/src/main/java/io/appium/java_client/windows/WindowsDriver.java b/src/main/java/io/appium/java_client/windows/WindowsDriver.java index 5c03692ec..97cb366cc 100644 --- a/src/main/java/io/appium/java_client/windows/WindowsDriver.java +++ b/src/main/java/io/appium/java_client/windows/WindowsDriver.java @@ -22,11 +22,11 @@ import io.appium.java_client.FindsByWindowsAutomation; import io.appium.java_client.HidesKeyboardWithKeyName; import io.appium.java_client.PressesKeyCode; +import io.appium.java_client.remote.AppiumCommandExecutor; import io.appium.java_client.service.local.AppiumDriverLocalService; import io.appium.java_client.service.local.AppiumServiceBuilder; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebElement; -import org.openqa.selenium.remote.HttpCommandExecutor; import org.openqa.selenium.remote.http.HttpClient; import java.net.URL; @@ -35,7 +35,7 @@ public class WindowsDriver extends AppiumDriver implements PressesKeyCode, HidesKeyboardWithKeyName, FindsByWindowsAutomation { - public WindowsDriver(HttpCommandExecutor executor, Capabilities capabilities) { + public WindowsDriver(AppiumCommandExecutor executor, Capabilities capabilities) { super(executor, substituteMobilePlatform(capabilities, WINDOWS)); } diff --git a/src/test/java/io/appium/java_client/android/AndroidDriverTest.java b/src/test/java/io/appium/java_client/android/AndroidDriverTest.java index 9ae72b96c..1f5d9d755 100644 --- a/src/test/java/io/appium/java_client/android/AndroidDriverTest.java +++ b/src/test/java/io/appium/java_client/android/AndroidDriverTest.java @@ -145,7 +145,7 @@ public class AndroidDriverTest extends BaseAndroidTest { } @Test public void getSupportedPerformanceDataTypesTest() { - driver.startActivity("io.appium.android.apis", ".ApiDemos"); + driver.startActivity(new Activity("io.appium.android.apis", ".ApiDemos")); List dataTypes = new ArrayList(); dataTypes.add("cpuinfo"); diff --git a/src/test/java/io/appium/java_client/appium/element/generation/android/AndroidElementGeneratingTest.java b/src/test/java/io/appium/java_client/appium/element/generation/android/AndroidElementGeneratingTest.java index dc1d89478..1e8223af3 100644 --- a/src/test/java/io/appium/java_client/appium/element/generation/android/AndroidElementGeneratingTest.java +++ b/src/test/java/io/appium/java_client/appium/element/generation/android/AndroidElementGeneratingTest.java @@ -2,7 +2,7 @@ import static io.appium.java_client.MobileBy.AndroidUIAutomator; import static org.junit.Assert.assertTrue; -import static org.openqa.selenium.By.className; +import static org.openqa.selenium.By.name; import static org.openqa.selenium.By.tagName; import io.appium.java_client.android.AndroidElement; @@ -64,6 +64,8 @@ public class AndroidElementGeneratingTest extends BaseElementGenerationTest { }, (by, aClass) -> { driver.get("https://www.google.com"); return commonPredicate.test(by, aClass); - }, className("gsfi"), AndroidElement.class)); + }, name("q"), AndroidElement.class)); } + + } diff --git a/src/test/java/io/appium/java_client/appium/element/generation/ios/IOSElementGenerationTest.java b/src/test/java/io/appium/java_client/appium/element/generation/ios/IOSElementGenerationTest.java index 3d0d995eb..2cbf3ba4a 100644 --- a/src/test/java/io/appium/java_client/appium/element/generation/ios/IOSElementGenerationTest.java +++ b/src/test/java/io/appium/java_client/appium/element/generation/ios/IOSElementGenerationTest.java @@ -2,8 +2,8 @@ import static io.appium.java_client.MobileBy.IosUIAutomation; import static org.junit.Assert.assertTrue; -import static org.openqa.selenium.By.className; import static org.openqa.selenium.By.id; +import static org.openqa.selenium.By.name; import io.appium.java_client.appium.element.generation.BaseElementGenerationTest; import io.appium.java_client.ios.IOSElement; @@ -88,7 +88,7 @@ public void whenIOSNativeAppIsLaunched() { } }); return commonPredicate.test(by, aClass); - }, className("gsfi"), IOSElement.class)); + }, name("q"), IOSElement.class)); } @Test public void whenIOSBrowserIsLaunched() { @@ -96,7 +96,7 @@ public void whenIOSNativeAppIsLaunched() { clientBrowserCapabilitiesSupplier, (by, aClass) -> { driver.get("https://www.google.com"); return commonPredicate.test(by, aClass); - }, className("gsfi"), IOSElement.class)); + }, name("q"), IOSElement.class)); } @Test @@ -116,6 +116,6 @@ public void whenIOSNativeAppIsLaunched2() { }, clientBrowserCapabilitiesSupplier, (by, aClass) -> { driver.get("https://www.google.com"); return commonPredicate.test(by, aClass); - }, className("gsfi"), IOSElement.class)); + }, name("q"), IOSElement.class)); } } diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/IOSMobileBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/IOSMobileBrowserCompatibilityTest.java index 1ca4715b2..d8568c40e 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/IOSMobileBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/IOSMobileBrowserCompatibilityTest.java @@ -43,7 +43,7 @@ public class IOSMobileBrowserCompatibilityTest { private WebDriver driver; private AppiumDriverLocalService service; - @FindBy(className = "gsfi") + @FindBy(name = "q") @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/someId\")") @iOSFindBy(className = "someClass") private WebElement searchTextField; diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java index 77e466ae3..450da87cd 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/MobileBrowserCompatibilityTest.java @@ -46,7 +46,7 @@ public class MobileBrowserCompatibilityTest { @AndroidFindBy(className = "someClass") @AndroidFindBy(xpath = "//someTag") private RemoteWebElement btnG; //this element should be found by id = 'btnG' or name = 'btnG' - @FindBy(className = "gsfi") + @FindBy(name = "q") @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"android:id/someId\")") private WebElement searchTextField;