C#以编程方式启动Appium - 目标机器主动拒绝它

时间:2016-09-12 10:07:54

标签: c# selenium appium

我想用C#以编程方式启动Appium服务器。 当我使用Appium窗口手动启动Appium时,它成功启动: Appium window

但是当我自动运行它时,我会得到一个例外:

"An unhandled exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll

Additional information: Unexpected error. System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:4723"

这是启动Appium Server的c#代码:

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "C:/Program Files (x86)/Appium/node.exe";
    startInfo.Arguments = @"""C:/Program Files (x86)/Appium/node.exe lib/server/main.js"" --address 127.0.0.1 --port 4723 --session-override --platform-name Android --platform-version 23 --automation-name Appium --log-no-color";
    process.StartInfo = startInfo;
    process.Start();


    capabilities = new DesiredCapabilities();
    capabilities.SetCapability("deviceName", "Samsung S6");
    capabilities.SetCapability("platformName", "Android");

    capabilities.SetCapability("platformVersion", "5.0.2");
    capabilities.SetCapability(CapabilityType.BrowserName, "Chrome");

    driver = new RemoteWebDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities, TimeSpan.FromSeconds(30));

我读过这些问题,但这对我没有帮助:

Appium iOS automation using C#/Visual Studio No connection could be made because the target machine actively refused it 127.0.0.1:3446

为什么我开始时手动Appium启动成功,但当我以编程方式启动它时,我被拒绝了?

4 个答案:

答案 0 :(得分:2)

这可能是因为服务器实例已经在端口4723上运行,尝试将端口号更改为5555或任意随机4位数字。

答案 1 :(得分:0)

以下是我在ruby中以progamatically开始并杀死appium的方法。

我创建了一个启动appium的配置文件,并检查其启动时间

  def run_appium_service
#this command kill appium if for some reason it wasnt killed after a
#previus execution, so i dont get the "is the server already running?"
#error when try to start, another way could be check if its up and start
#only if its not
    Process.fork { system 'killall node > /dev/null' }
    system '> tmp/appium.log'
    Process.fork { system 'appium --log-level debug > tmp/appium.log' }
    #wait appium load
    t = 10
    until !(File.readlines(project_home + "/tmp/appium.log").grep(/interface listener started/).empty?) or t == 0 do
      sleep(0.5)
      t -= 1
    end
  end

上面的方法只启动appium服务器,而不是驱动程序。 为了启动驱动程序,我创建了列出的两种方法: 我在套件之前在我的RSpec挂钩上调用它。

  def capabilities(options = {})
    caps = Hash.new
    caps.default = {
        platformName: 'iOS',
        deviceName: get_device_name,
        app: app_ipa,
        launchTimeout: 100000,
        autoAcceptAlerts: false,
        newCommandTimeout: 12000,
        udid: get_udid,
        fullReset: false
    }
    caps.default.merge(options)
  end

  def start_appium_driver
    caps = capabilities
    $appium = Appium::Driver.new(caps: caps)
    $browser = $appium.start_driver
    Appium.promote_appium_methods RSpec::Core::ExampleGroup
  end

这是我的规范配置文件,它使一切正常工作

module SpecHelper
  run_appium_service
  RSpec.configure do |config|
    config.before :suite do
      start_appium_driver
    end
    config.after :suite do
      if defined? driver
        driver_quit
      end
    end
  end
end

答案 2 :(得分:0)

'目标机器主动拒绝它''(TCP / IP)异常意味着,可以到达IP地址但是不能与指定端口上的服务器建立连接。

如何调试

第1步:检查您的服务器是否正在侦听您尝试连接的端口:

在服务器计算机上,使用此命令(您需要管理员权限):

netstat -ab > D:\portscan.txt

这需要一段时间(大约一分钟左右)但是一旦命令执行完成,它将在D:驱动器中创建一个portscan.txt文件。在该文件中搜索您的端口并检查它是否已打开。

第2步:如果端口已打开但仍无法连接。这意味着防火墙阻止了它。在防火墙中添加例外(在服务器端),在大多数情况下你应该能够连接到端口。

答案 3 :(得分:0)

使用最新的Appium服务器,可以在通过功能/驱动程序选项初始化客户端驱动程序时以编程方式启动驱动程序实例。

我在Mac Catalina中拥有Appium服务器1.17.1,使用的是.NET(C#)的Appium.WebDriver 4.1.1客户端库。

//Initialise capabilities
AppiumOptions appiumOptions = new AppiumOptions();

//Declare capabilities
...

//Initialise the iOS driver
var iosDriver = new IOSDriver<IMobileElement<AppiumWebElement>>(appiumOptions);

//Initialise the android driver
var androidDriver = new AndroidDriver<IMobileElement<AppiumWebElement>>(appiumOptions);

无需从命令行启动appium服务器。