Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#以编程方式启动Appium-目标机器主动拒绝它_C#_Selenium_Appium - Fatal编程技术网

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

C#以编程方式启动Appium-目标机器主动拒绝它,c#,selenium,appium,C#,Selenium,Appium,我想使用C#以编程方式启动Appium服务器。 当我使用Appium窗口手动启动Appium时,它会成功启动: 但当我自动运行它时,通常会出现异常: "An unhandled exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll Additional information: Unexpected error. System.Net.WebException: Unable to c

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

但当我自动运行它时,通常会出现异常:

"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服务器的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));
我读了这些问题,但对我没有帮助:


为什么我启动时手动启动成功,但是,当我以同样的编程方式启动它时,我被拒绝了?

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

以下是我在ruby中以编程方式启动并杀死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
这是我的spec-config文件,它使所有的东西都工作在一起

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

“目标计算机主动拒绝”异常(TCP/IP)意味着可以访问IP地址,但无法连接到指定端口上的服务器

如何调试

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

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

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


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

对于最新的Appium服务器,当通过功能/驱动程序选项初始化客户端驱动程序时,可以通过编程启动驱动程序实例

我在MacCatalina中使用了Appium.WebDriver 4.1.1.NET客户端库(C#),安装了Appium server 1.17.1

//初始化功能
AppiumOptions AppiumOptions=新的AppiumOptions();
//声明功能
...
//初始化iOS驱动程序
var iosDriver=新的iosDriver(应用程序选项);
//初始化android驱动程序
var androidDriver=新的androidDriver(应用程序选项);

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

我是在ruby中这样做的,现在当我启动rspec测试时,它会启动appium,并在测试运行后杀死它。不确定这是否会有帮助,但如果你愿意,我可以用我的代码发布一个答案。这个错误是因为appium已经在运行了,你可以通过调用killall node来杀死它,如果它是一台mac机器,你必须在测试后加入杀死appium的代码,这样你就不会再有这个问题了是的,如果你可以发布你的代码,谢谢,在尝试启动Appium Server之前,我如何检查它当前是否正在运行?目前我不知道如何检查,但我将进行研究并与您分享。改变港口对你有用吗?
netstat -ab > D:\portscan.txt
//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);