web-dev-qa-db-ja.com

既存のWebdriverオブジェクトをカスタムPython RobotFrameworkのライブラリに渡す

RobotFramework用のカスタムPythonライブラリを作成しようとしていますが、PythonとRobotは初めてで、何を達成するかわかりませんロボットがSelenium2Libraryを使用して作成したWebdriverオブジェクトをカスタムPythonライブラリに渡して、find_element_by_idなどのWebdriverのメソッドを使用できるようにします。私はそれを行う方法についていくつかの提案を見てきました ここここ 、しかしそれらはJavaライブラリ-私はできませんPython命令を見つけます。

Pythonでこれを行うにはどうすればよいですか?または、Webdriverオブジェクトを渡さずに、これを別の方法で実行したいですか?

14

ライブラリには、やりたいこと自体を実行できるものは何も組み込まれていません。ただし、Seleniumの機能にアクセスできる独自のライブラリを作成できます。これを実現するには2つの方法があり、どちらもPythonで独自のライブラリを作成する必要があります。これらのメソッドは、Selenium2Libraryをサブクラス化するか、Selenium2Libraryインスタンスへの参照を取得するためのものです。

Selenium2Libraryをサブクラス化するカスタムライブラリの作成

Selenium2Libraryの内部にアクセスする1つの方法は、Selenium2Libraryから継承するライブラリクラスを作成することです。これを行うと、元のライブラリのすべてにアクセスできます。次に、WebDriverオブジェクトへの参照を返すか、Pythonで独自のキーワードを記述することができます。

例として、現在のWebDriverインスタンスを返す新しいキーワードを持つカスタムSeleniumライブラリを次に示します。これは、(元のSelenium2Libraryに対する)プライベートメソッド_current_browserを呼び出すことによって行われます。これは私的な方法なので、時の試練に耐えられる保証はありませんが、私がこれを書いている時点では存在しています。

カスタムSeleniumライブラリを作成する

まず、CustomSeleniumLibrary.pyという名前の新しいpythonファイルを作成します。ロボットが見つけられる場所に配置します。最も簡単なのは、使用するテストスイートと同じフォルダーに配置することです。そのファイルに以下を入れてください:

from Selenium2Library import Selenium2Library

# create new class that inherits from Selenium2Library
class CustomSeleniumLibrary(Selenium2Library):
    # create a new keyword called "get webdriver instance"
    def get_webdriver_instance(self):
        return self._current_browser()

ライブラリを使用するテストケースを作成する

次に、Selenium2Libraryの代わりにこれを使用するテストケースを作成します。例えば:

*** Settings ***
| Library | CustomSeleniumLibrary.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom Selenium library
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}

テストを実行します

他のテストと同じようにテストを実行します。完了すると、ログに次のようなものが表示されます。

16:00:46.887 INFO webdriver: <Selenium.webdriver.chrome.webdriver.WebDriver object at 0x10b849410>

テストケースでオブジェクトを使用する

不可解な...<Selenium....WebDriver object...>メッセージは、変数が実際にpython WebDriverオブジェクトへの参照を保持していることを証明します。ロボットの 拡張変数構文 を使用して、メソッドを呼び出すことができます。必要に応じて、そのオブジェクトの属性にアクセスします。この方法で行うことはお勧めしませんが、ロボットがそれをサポートしていることは非常に興味深いと思います。

| | log | The page title is ${webdriver.title}

Selenium2Libraryを参照するカスタムライブラリを作成する

これを実現する2番目の方法は、ライブラリのインスタンスを取得するロボットの方法を使用することです。この時点で、オブジェクトに好きなようにアクセスできます。これは、ロボットのユーザーガイドに記載されています。 Robot FrameworkユーザーガイドRobot Frameworkからアクティブなライブラリインスタンスを取得する を参照してください。

たとえば、上記の例のget_library_instanceキーワードは次のようになります。

from robot.libraries.BuiltIn import BuiltIn

def get_webdriver_instance():
    se2lib = BuiltIn().get_library_instance('Selenium2Library')
    return se2lib._current_browser()

この場合、Selenium2Libraryの両方のカスタムライブラリを含める必要があることに注意してください。

*** Settings ***
| Library | Selenium2Library
| Library | CustomSeleniumKeywords.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom Selenium keyword
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}
25
Bryan Oakley

RobotFrameworkユーザーガイドの例を見てください。

Robot Frameworkからアクティブなライブラリインスタンスを取得する

継承に対する最大の利点(前に回答したとおり)は、元のライブラリを通常どおりに使用でき、必要に応じて新しいライブラリを使用できることです。

2
Noam Manos

「ブラウザを開いて」ロボットですべてのステップを作成するのにrobotf-rameworkは必要ありません。ロボットをシーケンサーとして使用し、Seleniumを使用してロボットの通常のpythonスクリプトから呼び出すことができます(pipを使用してSeleniumをインストールします)。次に、ロボットには、Seleniumを使用した通常の小さなpythonスクリプトのテストスイートがあります。これはプログラミングスキルに関してはもう少し進んでいますが、pythonスクリプトでは、ロボットのキーワード駆動型のより標準的なコーディング構文を使用します。したがって、すべての詳細をpythonスクリプトにカプセル化し、(テストスイートを介して)高レベルのみをロボットに公開できます。

0
DanR