2016-03-24 13 views
0

私は「FirefoxDriverを使用できません」という問題に直面しています。 。私はquit()を呼び出した後にドライバをインスタンス化しましたが、引き続きFirefoxDriverを使用することはできません。

私のフレームワークでは、WebDriverドライバ変数を静的変数として使用しました。各テストケースの終わりに、私はdriver.quit()メソッドを実行しました。 次のテストケースの開始時に、私は再びfirefoxdriver()の新しいインスタンスでドライバ変数を更新しましたが、ドライバ変数を使用してドライバ要素がnullを返すようにしました。ここに私のコードの簡略版があります。コンソールで

public class Frame 
{ 
    private static WebDriver driver; 

    public static WebDriver openUrl(String URL) 
    { 
     driver = new FirefoxDriver(); 
     driver.get(URL); 
     return driver; 
    } 

    public static WebDriver returnWebDriverInstance() 
    { 
     System.out.println("I am called"); 
     return driver; 
    } 
} 

public class javaCheck2 
{ 
    private static WebDriver driver = Frame.returnWebDriverInstance(); 

    static 
    { 
     // driver = Frame.returnWebDriverInstance(); 
     System.out.println(driver + " in static"); 
    } 

    public static void pageMaxim() 
    { 
     System.out.println(driver + " in page maxim"); 
     driver.manage().window().maximize(); 
    } 

    public static void pagesource() 
    { 
     System.out.println(driver + " in page source"); 
     driver.getPageSource(); 
    } 
} 

@Test 
public class TestCase1 
{ 
    public void TC01() 
    { 
     WebDriver driver = Frame.openUrl("https://www.google.com"); 
     javaCheck2.pagesource(); 
     driver.quit(); 

     // driver.close(); 
    } 
} 

@Test 
public class TestCase2 
{ 
    public void TC02() 
    { 
     WebDriver driver = Frame.openUrl("https://www.gmail.com"); 
     javaCheck2.pageMaxim(); 
     driver.quit(); 
     // driver.close(); 
    } 
} 

出力:

I am called 
FirefoxDriver: firefox on MAC (6df8103b-673f-954f-b20d-72fa4b9181b8) in static 
FirefoxDriver: firefox on MAC (6df8103b-673f-954f-b20d-72fa4b9181b8) in page source 
FirefoxDriver: firefox on MAC (null) in page maxim 

=============================================== 

Suite 

Total tests run: 2, Failures: 1, Skips: 0 

=============================================== 

+0

を。私はコードをリファクタリングしてより読み易いものにすることが99%であると確信しています(2つの簡単なテストですが、その半分を結びつけるのに時間がかかりました)。 "グローバル"ドライバ変数を持っている場合は、メソッド内でローカルコピーを作成する必要はありません。一方、確実に必要な場合は、localDriver、driver2などの何かを呼び出す必要があります。 – skandigraun

+0

フレームクラスの静的なWebDriverドライバはprivateです。私はクラスの外からドライバメンバー変数に直接アクセスすることができないので、このプライベートな静的メソッドのコピーをメソッドで取得する必要があります。 – Coder

答えて

0

トラブルを助けてくださいようにjavaCheck2の静的driverインスタンスは、(静的初期化ブロックで)一度設定し、決してリセットされていることですすぐにquit()と呼ぶと、基礎となるセッション(nullではない)は無効になります。決してリセットされることはありません。そのため、ドライバインスタンスを再度使用しようとするとすぐに障害が発生します。

最も簡単な修正があり、これは(大きなリファクタリングなし)動作するように取得する:まさに、私はそれはいくつかのスコープ隠し問題だと思うのかわからない

public class javaCheck2 { 
    public static void pageMaxim() { 
     Frame.returnWebDriverInstance().manage().window().maximize(); 
    } 

    public static void pagesource() { 
     Frame.returnWebDriverInstance().getPageSource(); 
    } 
} 
+0

TestCase2クラスでquit()を呼び出した後、私は与えられたコマンドを実行しています。 WebDriverドライバ= Frame.openUrl( "https://www.gmail.com"); したがって、フレームクラスの静的ドライバ変数には新しいインスタンスがあります。 JavaCheck2のドライバ変数は、次のコマンドがコード内で1回だけ実行されるため、再度開始されません。 プライベート静的WebDriverドライバ= Frame.returnWebDriverInstance(); – Coder

+1

TestCase2クラスでquit()を呼び出した後、私は与えられたコマンドを実行しています。 WebDriverドライバ= Frame.openUrl( "https://www.gmail.com"); したがって、フレームクラスの静的ドライバ変数には新しいインスタンスがあります。 JavaCheck2のドライバ変数は、次のコマンドがコード内で1回だけ実行されるため、再度開始されません。 プライベート静的WebDriverドライバ= Frame.returnWebDriverInstance(); //はTC02の実行中は実行されません。 これは、javaCheck2のドライバが引き続き古いセッションを参照している理由です。 これはあなたの説明です。 – Coder

+0

私はそれを数回読んでチェックする必要がありましたが、そうです。あなたがリファクタリングしたい場合は、できるだけ多くの静的なものを削除することをお勧めします。 –

関連する問題