2017-02-19 12 views
0

サイトを閲覧しましたが、私が探している回答が見つかりませんでした。Selenium webdriverのインスタンスを別のクラスに渡す方法

私は超強塩基が、私はこのクラスではwebdriverを

  • Baseclass-のオブジェクトを作成し、ここでクラス -

    1. 私は超強塩基クラスを拡張し、ドライバを起動し、URLを開いてきました。
    2. Clicklinkクラス - このクラスでは、再びスーパーベースクラスを拡張しますが、nullポインタ例外を見つけるためにのみ使用します。私は、ドライバオブジェクトが初期化されていないので例外が発生していると思います。

    私は単純な流れから始めたいので、私は初心者であり、browserfactoryやその他のオプションを試していません。

    スーパー

    Public class Superclass 
        { 
    public webdriver Driver; 
    } 
    

    基底クラス

    public class Baseclass extends Superclass 
    { 
    setting capabilities and launching the browser 
    } 
    

    ClickLink

    public class Clicklink extends Superclass 
    { 
    here I want to click on a link 
    driver.findelement(by.xpath("xpath").click()); 
    // after this statement I get a null pointer exception 
    } 
    

    あなたはここに私を導いてくださいことはできますか?どのように私は同じを達成することができます。

    ありがとうございます!

  • +1

    は、あなたの方法には、してください表示します。 –

    +1

    '@ Before *'メソッドやコンストラクタで「機能を設定してブラウザを起動しますか?」 –

    +0

    おそらく、子クラスのスーパークラスのオブジェクトを作成し、それを呼び出します。 スーパークラスsl = newスーパークラス(); sl.driver.findelement(by.xpath( "xpath"))。クリック()); – kushal

    答えて

    0

    これは私の側から推測されたものですが、スーパークラスが実際にドライバを設定して返すことを確認してください。あなたは、実際に両方の方法でそれを行うことができます。

    によって
    public class Superclass 
    { 
        public WebDriver driver; 
        public Superclass(){ 
        driver = new FirefoxDriver(); 
        } 
        public WebDriver getdriver(){ 
        if (driver == null){ 
         driver = new FirefoxDriver(); 
         return driver; 
        }else{ 
         return driver; 
        } 
        } 
    } 
    

    以降、あなたはそれを呼び出す方法で:

    public class Clicklink extends Superclass 
    { 
    
    getdriver().findelement(by.xpath("xpath").click()); 
    
    } 
    
    +0

    ありがとう@Pavel、これは役立ちます – Ashwin

    0

    クラスの名前にコーディング言語を使用しないでください。 SuperClassとBaseClassは非常に貧しい名前です。代わりに、問題の言葉を使って物事に名前を付けてください。この場合、Webサイトアプリケーションのテストでは、LoginPage、CartPage、ProfilePageなどの方が良いでしょう。Page Object Patternを使用してください。ページでは、ドライバーのためのいくつかのコンテナクラスを作成し、テストの前にそれを置くと、実行した後、それを削除することができ、コンストラクタをオブジェクトに使用すると、パス・ドライバー・インスタンスを望んでいない場合はwebdriverを

    public abstract class PageObject { 
        public WebDriver driver; 
        PageObject() { 
         // Page can initialise its self 
         this.driver = BrowserFactory.webDriver(); 
        } 
        PageObject(final WebDriver webDriver) { 
         this.driver = webDriver; 
         } 
        } 
    
    0

    のインスタンスを提供するために、BrowserFactoryを使用してください。たとえば、次のように

    class Driver { 
        public static ThreadLocal<IWebDriver> driverInstance = new ThreadLocal<IWebDriver>(); 
    
        public static IWebDriver GetDriver() { 
         return driverInstance.Value; 
        } 
    
        public static void SetDriver(IWebDriver driver) { 
         driverInstance.Value = driver; 
        } 
    } 
    

    と並列実行の問題を避けるために、このコンテナフィールドThreadLocalを作ります。

    0
    I did use below code in utility class like below 
        public static WebDriver setup(WebDriver driver) 
        { 
         if(driver == null) { 
          driver = new FirefoxDriver(); 
          driver.manage().window().maximize(); 
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
          return driver; 
         }else 
          return driver; 
    
         //System.out.println("in method "+ driver.getTitle()); 
    
        } 
    
    +0

    パブリッククラスEbay { WebDriver driver = null; @Test公共ボイドtestlogic(){ ドライバ= Container.setup(ドライバ) driver.get( "https://www.ebay.co.uk"); } – dev

    +1

    本当にこれを編集する必要があります。 – klutt

    関連する問題