从Selenium.Webdriver 2.44更新到2.46会导致NullReferenceException

时间:2015-06-16 16:41:27

标签: c# android selenium nullreferenceexception appium

我们刚刚开始在我的公司与Appium合作,使用它来自动化网站和网络应用程序的测试。

Testing Framework = Nunit 2.6.4
Language used     = C#
Mobile Device     = Samsung Galaxy S4
Android version   = 5.0.1

我之前在一个简单的网站上使用Selenium和Nunit在桌面上进行测试,在我的测试中使用[Test],[TestCase]和[TestCaseSource]属性。

遵循答案文章中的建议: How to integrate Appium with C#?

(这里有更快的文章链接: http://blogs.technet.com/b/antino/archive/2014/09/22/how-to-set-up-a-basic-working-appium-test-environment.aspx

一名员工设置了一个解决方案,可以对StackOverflow进行简单导航,点击链接并断言:

namespace AppiumTests
{
using System;
using NUnit.Framework;
using AppiumTests.Helpers;
using AppiumTest.Framework;
using OpenQA.Selenium; /* Appium is based on Selenium, we need to include it */
using OpenQA.Selenium.Appium; /* This is Appium */
using OpenQA.Selenium.Appium.Interfaces; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Appium.MultiTouch; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Interactions; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Appium.Android;

[TestFixture]
public class AndroidAppiumTestSuite
{
    private AppiumDriver driver;

    private static Uri testServerAddress = new Uri(TestServers.WindowsServer);
    private static TimeSpan INIT_TIMEOUT_SEC = TimeSpan.FromSeconds(180); /* Change this to a more reasonable value */
    private static TimeSpan IMPLICIT_TIMEOUT_SEC = TimeSpan.FromSeconds(10); /* Change this to a more reasonable value */

    [SetUp]
    public void BeforeAll()
    {
        DesiredCapabilities capabilities = new DesiredCapabilities();



        TestCapabilities testCapabilities = new TestCapabilities();

        //testCapabilities.App = "";
        testCapabilities.AutoWebView = true;
        testCapabilities.AutomationName = "<just a name>";
        testCapabilities.BrowserName = "Chrome"; // Leave empty otherwise you test on browsers
        testCapabilities.DeviceName = "Needed if testing on IOS on a specific device. This will be the UDID";
        testCapabilities.FwkVersion = "1.0"; // Not really needed
        testCapabilities.Platform = TestCapabilities.DevicePlatform.Android; // Or IOS
        testCapabilities.PlatformVersion = "5.0.1"; // Not really needed


        testCapabilities.AssignAppiumCapabilities(ref capabilities);
        driver = new AndroidDriver(testServerAddress, capabilities, INIT_TIMEOUT_SEC);
        driver.Manage().Timeouts().ImplicitlyWait(IMPLICIT_TIMEOUT_SEC);
    } 

    [TearDown]
    public void AfterAll()
    {
        TestContext.CurrentContext.Result.ToString();
        driver.Quit(); // Always quit, if you don't, next test session will fail
    }

    /// <summary>
    /// Just a simple test to heck out Appium environment.
    /// </summary>
    [Test]
    public void CheckTestEnvironment()
    {
        driver.Navigate().GoToUrl("http://stackoverflow.com");
        driver.FindElementByCssSelector("body > div.topbar > div.network-items > div.login-links-container > a").Click();
        Assert.AreEqual("Log in using any of the following services", (driver.FindElementByCssSelector("h2.title")).Text);
    }    

非常感谢Andrea Tino这个起点。

现在这个工作正常,我的同事设置了这个并向我展示了它已经去度假了,让我的任务就是添加我们现有的测试并在这里和那里调整位。

我在我的testclass中添加了,需要安装Webdriver.Support pacakge,这取决于Webdriver&gt; = 2.46.0

现在,当我运行我的代码时,我在这一行得到一个空引用异常: driver = new AndroidDriver(testServerAddress, capabilities, INIT_TIMEOUT_SEC);

这是我得到的错误:

AppiumTests.AndroidAppiumTestSuite.CheckTestEnvironment: SetUp : System.NullReferenceException : Object reference not set to an instance of an object. TearDown : System.NullReferenceException : Object reference not set to an instance of an object.

所以我的想法是2.46.0中的某些东西意味着我需要提供另一种能力,但我现在已经开始对抗这种情况已经两天没有进展了。

我有appium服务器通信的屏幕截图,但是我还无法将图像链接到XD,所以这里是粘贴的:

  

info:[debug]设备已启动!准备好命令

     

info:[debug]将命令超时设置为默认值60秒

     

info:[debug] Appium会话以sessionId 4575272bba7d11c85414d48cf53ac8e3开始

     

info:&lt; - POST / wd / hub / session 303 10828.204 ms - 70

     

info: - &gt; GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3 {}

     

info:代理[GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3]到[GET http://127.0.0.1:9515/wd/hub/session/4575272bba7d11c85414d48cf53ac8e3] with body:{}

     

信息:获得状态200的响应:{&#34; sessionId&#34;:&#34; 4575272bba7d11c85414d48cf53ac8e3&#34;,&#34; status&#34;:0,&#34; value&#34;: {&#34; acceptSslCerts&#34;:真,&#34; applicationCacheEnabled&#34;:假,&#34; browserConnectionEnabled&#34;:假,&#34; browserName&#34;:&#34;铬&#34 ;,&#34;铬&#34;:{},&#34; cssSelect ...

     

info:&lt; - GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3 200 6.770 ms - 506

     

info: - &gt; POST / wd / hub / session {&#34; desiredCapabilities&#34;:{&#34; javascriptEnabled&#34;:true,&#34; device&#34;:&#34; Android&#34;,&#34 ; platformName&#34;:&#34; Android和#34;&#34; DEVICENAME&#34;:&#34; d5cb5478&#34;&#34; browserName&#34;:&#34;铬&#34; &#34; platformVersion&#34;:&#34; 5.0.1&#34;&#34; browserVersion&#34;:&#34; 43.0.2357.93&#34;}}

     

错误:无法启动Appium会话,错误是:错误:请求新会话但其中一个正在进行中

所以从这里我可以看到,当我已经开始新会议时,它试图开始一个新的会议,但我无法弄清楚原因!

1 个答案:

答案 0 :(得分:1)

所以这里是如何解决特定于Appium的问题的一半 - 我的NullReferenceException没有答案。

当您尝试启动Appium WebDriver的端口已被使用时,会导致Appium错误。

手动修复此

  1. 您可以$telnet ip port找出您需要杀死的Process ID

    • 您可以通过查看new Uri(TestServers.WindowsServer);返回的值来找到地址/端口。
  2. 退出所有模拟器

  3. 获得PID后,您就可以$kill -9 pid正常启动Appium服务器。

  4. 正确的解决方案

    如果您经常遇到此问题,可能是因为您的脚本在没有退出Appium WebDriver的情况下结束。

    通常,您将WebDriver(driver.quit())的拆解代码放在测试的@After部分或基础TestCase类中。

      

    我看到你有一个拆解部分 - 所以也许你在上一次会议期间陷入了这种糟糕的状态?无论哪种方式,手动修复都可以让您恢复正常工作。