如何从 Eclipse 中的 Java 代码启动 appium 服务器
How to start appium sever from the Java code in Eclipse
我正在尝试从我的测试用例代码以编程方式启动 appium 服务器,但没有任何帮助。控制台总是给我 "org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure" 错误消息。到目前为止我尝试了什么:
CommandLine command = new CommandLine("cmd");
command.addArgument("/c");
command.addArgument("C:/Program Files (x86)/Appium/node.exe");
command.addArgument("C:/Program Files (x86)/Appium/node_modules/appium/bin/appium.js");
command.addArgument("--address");
command.addArgument("127.0.0.1");
command.addArgument("--bootstrap-port");
command.addArgument("5001");
command.addArgument("--no-reset");
command.addArgument("--log");
无效。下一篇:
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
executor.execute(new CommandLine("C:/Program Files (x86)/Appium/node.exe"), resultHandler);
executor.execute(new CommandLine("C:/Program Files (x86)/Appium/node_modules/appium/bin/Appium.js --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 4725 --selendroid-port 8082 --no-reset --local-timezone"), resultHandler);
无效。下一篇:
ProcessBuilder pb = new ProcessBuilder("C:/Program Files(x86)/Appium/node.exe/");
ProcessBuilder pb1 = new ProcessBuilder("C:/Program Files(x86)/Appium/node_modules/appium/bin/Appium.js --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 5002 --no-reset --local-timezone");
pb.start();
pb1.start();
无效。下一篇:
String path = "cmd /c start C:/Users/jamesrobinson/Desktop/Run automation servers.bat";
Runtime rn = Runtime.getRuntime();
Process process = rn.exec(path);
我可以启动它的唯一方法是从 UI 手动启动它。任何解决方法的想法将不胜感激。
在分享屏幕截图之前,我只是猜测也许更改为 default
端口可能会帮助您成功创建会话:
command.addArgument("--bootstrap-port");
command.addArgument("4723");
一般的一行命令如下:
String command = "/Applications/Appium.app/Contents/Resources/node/bin/node /Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/main.js --command-timeout 120 --session-override" + nativelib + " --platform-name " + mobileOS + " --log-timestamp -a 0.0.0.0 -p "+4723; //+" --chromedriver-port "+chromePort+" -bp "+bootstrapPort;
其中
nativelib = " --native-instruments-lib"; //for iOS
nativelib = ""; //for android
和
mobileOS = "iOS"; //for iOS
mobileOS = "Android"; //for Android
Explanation:
1. Create a command string and then write this command in some .bat file and then execute this .bat file.
2. (Code not posted here for this ==> )After executing this, you need to put a wait until appium server is started, you can do this by sending request to http://localhost:4723, wait until you get response from this url and then you can initiate the driver.
//Getting temp dir
String tempDir = System.getProperty("java.io.tmpdir").toString();
logFile = new File(tempDir+"\applog.txt");
String commandFile = "C:\appium_commands.bat";
String nodeExe = "C:\node.exe";
String appiumJs = "C:\node_modules\appium\bin\Appium.js");
String strText = "start /B " + nodeExe + " " + appiumJs + " -g " + logFile.toString() + " --full-reset --command-timeout 90 ";
logger.info("****** STARTING APPIUM SERVER USING COMMAND: "+strText);
WriteTextInFile(commandFile, strText);
Runtime.getRuntime().exec(commandFile);
********************* Code to Write Text in File ***********
WriteTextInFile(String commandFile, String strText)
{
FileWriter writer = new FileWriter(file);
writer.write(strText);
writer.close();
}
************ Code to Send GET Request and Check Response *******
//In this code, you can keep on checking until you get NON-Empty //result.tostring(); Also download and add apache httpclient-4.XXX.jar and //httpcore-4.XXX.jar to your project.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Test {
public static void main(String[] args) {
String ServerURL = "http://localhost:4723";
StringBuffer result = new StringBuffer();
CloseableHttpClient httpclient = null;
CloseableHttpResponse response = null;
try
{
httpclient = HttpClients.createDefault();
ServerURL = ServerURL.replace("%%", "").trim();
HttpGet GetRequest = new HttpGet(ServerURL);
try{
response = httpclient.execute(GetRequest);
}catch(HttpHostConnectException h){
System.out.println("Couldn't connect to host: "+ServerURL);
}
BufferedReader rd = null;
try{
rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent()));
}catch(NullPointerException e){
System.out.println("no response received.. ");
}
if(rd != null)
{
String line = "";
while ((line = rd.readLine()) != null)
{
result.append(line);
}
}
}
catch(Exception e)
{
}
finally
{
try{
response.close();
httpclient.close();
}
catch(Exception e){
}
System.out.println("Final Response: "+result.toString());
}
}
}
*********** node.json to be used with appium ***********
{
"capabilities":
[
{
"version":"4.4.2",
"maxInstances": 3,
"platformName":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://WHERE_APPIUM_RUNNING_IP:4723/wd/hub",
"host": "WHERE_APPIUM_RUNNING_IP",
"port": 4723,
"maxSession": 6,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "WHERE_GRID_RUNNING_IP"
}
}
前置条件:
- 确保您的系统中安装了 nodejs
- 确保您的系统中安装了 appium。
--在下面给定的脚本中输入两者的位置。
public class mainClass{
AppiumDriverLocalService service;
@Test
public void startSErver(){
service=AppiumDriverLocalService.buildService(new AppiumServiceBuilder()
.usingDriverExecutable(new File("C:\Program Files\nodejs\node.exe"))
.withAppiumJS(new File("C:\Program Files (x86)\Appium\node_modules\appium\bin\appium.js"))
.withIPAddress("127.0.0.1").usingPort(4723));
service.start(); // To start the appium server
我正在尝试从我的测试用例代码以编程方式启动 appium 服务器,但没有任何帮助。控制台总是给我 "org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure" 错误消息。到目前为止我尝试了什么:
CommandLine command = new CommandLine("cmd");
command.addArgument("/c");
command.addArgument("C:/Program Files (x86)/Appium/node.exe");
command.addArgument("C:/Program Files (x86)/Appium/node_modules/appium/bin/appium.js");
command.addArgument("--address");
command.addArgument("127.0.0.1");
command.addArgument("--bootstrap-port");
command.addArgument("5001");
command.addArgument("--no-reset");
command.addArgument("--log");
无效。下一篇:
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
executor.execute(new CommandLine("C:/Program Files (x86)/Appium/node.exe"), resultHandler);
executor.execute(new CommandLine("C:/Program Files (x86)/Appium/node_modules/appium/bin/Appium.js --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 4725 --selendroid-port 8082 --no-reset --local-timezone"), resultHandler);
无效。下一篇:
ProcessBuilder pb = new ProcessBuilder("C:/Program Files(x86)/Appium/node.exe/");
ProcessBuilder pb1 = new ProcessBuilder("C:/Program Files(x86)/Appium/node_modules/appium/bin/Appium.js --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 5002 --no-reset --local-timezone");
pb.start();
pb1.start();
无效。下一篇:
String path = "cmd /c start C:/Users/jamesrobinson/Desktop/Run automation servers.bat";
Runtime rn = Runtime.getRuntime();
Process process = rn.exec(path);
我可以启动它的唯一方法是从 UI 手动启动它。任何解决方法的想法将不胜感激。
在分享屏幕截图之前,我只是猜测也许更改为 default
端口可能会帮助您成功创建会话:
command.addArgument("--bootstrap-port");
command.addArgument("4723");
一般的一行命令如下:
String command = "/Applications/Appium.app/Contents/Resources/node/bin/node /Applications/Appium.app/Contents/Resources/node_modules/appium/lib/server/main.js --command-timeout 120 --session-override" + nativelib + " --platform-name " + mobileOS + " --log-timestamp -a 0.0.0.0 -p "+4723; //+" --chromedriver-port "+chromePort+" -bp "+bootstrapPort;
其中
nativelib = " --native-instruments-lib"; //for iOS
nativelib = ""; //for android
和
mobileOS = "iOS"; //for iOS
mobileOS = "Android"; //for Android
Explanation:
1. Create a command string and then write this command in some .bat file and then execute this .bat file.
2. (Code not posted here for this ==> )After executing this, you need to put a wait until appium server is started, you can do this by sending request to http://localhost:4723, wait until you get response from this url and then you can initiate the driver.
//Getting temp dir
String tempDir = System.getProperty("java.io.tmpdir").toString();
logFile = new File(tempDir+"\applog.txt");
String commandFile = "C:\appium_commands.bat";
String nodeExe = "C:\node.exe";
String appiumJs = "C:\node_modules\appium\bin\Appium.js");
String strText = "start /B " + nodeExe + " " + appiumJs + " -g " + logFile.toString() + " --full-reset --command-timeout 90 ";
logger.info("****** STARTING APPIUM SERVER USING COMMAND: "+strText);
WriteTextInFile(commandFile, strText);
Runtime.getRuntime().exec(commandFile);
********************* Code to Write Text in File ***********
WriteTextInFile(String commandFile, String strText)
{
FileWriter writer = new FileWriter(file);
writer.write(strText);
writer.close();
}
************ Code to Send GET Request and Check Response *******
//In this code, you can keep on checking until you get NON-Empty //result.tostring(); Also download and add apache httpclient-4.XXX.jar and //httpcore-4.XXX.jar to your project.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class Test {
public static void main(String[] args) {
String ServerURL = "http://localhost:4723";
StringBuffer result = new StringBuffer();
CloseableHttpClient httpclient = null;
CloseableHttpResponse response = null;
try
{
httpclient = HttpClients.createDefault();
ServerURL = ServerURL.replace("%%", "").trim();
HttpGet GetRequest = new HttpGet(ServerURL);
try{
response = httpclient.execute(GetRequest);
}catch(HttpHostConnectException h){
System.out.println("Couldn't connect to host: "+ServerURL);
}
BufferedReader rd = null;
try{
rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent()));
}catch(NullPointerException e){
System.out.println("no response received.. ");
}
if(rd != null)
{
String line = "";
while ((line = rd.readLine()) != null)
{
result.append(line);
}
}
}
catch(Exception e)
{
}
finally
{
try{
response.close();
httpclient.close();
}
catch(Exception e){
}
System.out.println("Final Response: "+result.toString());
}
}
}
*********** node.json to be used with appium ***********
{
"capabilities":
[
{
"version":"4.4.2",
"maxInstances": 3,
"platformName":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://WHERE_APPIUM_RUNNING_IP:4723/wd/hub",
"host": "WHERE_APPIUM_RUNNING_IP",
"port": 4723,
"maxSession": 6,
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "WHERE_GRID_RUNNING_IP"
}
}
前置条件:
- 确保您的系统中安装了 nodejs
- 确保您的系统中安装了 appium。
--在下面给定的脚本中输入两者的位置。
public class mainClass{
AppiumDriverLocalService service;
@Test
public void startSErver(){
service=AppiumDriverLocalService.buildService(new AppiumServiceBuilder()
.usingDriverExecutable(new File("C:\Program Files\nodejs\node.exe"))
.withAppiumJS(new File("C:\Program Files (x86)\Appium\node_modules\appium\bin\appium.js"))
.withIPAddress("127.0.0.1").usingPort(4723));
service.start(); // To start the appium server