1

Selenium IDE Python Remote Control プラグイン フォーマッタによってエクスポートされた複数の Python テスト スクリプトを実行すると、いくつか問題が発生します。

1) Python スクリプトが完了すると、ブラウザ ウィンドウは自動的に閉じます。私の例では、Firefoxでテストを実行しています。

2) Selenium は、Python でテスト スイートをエクスポートできません。Python でテスト スイートの機能を複製するにはどうすればよいですか?

Python でテスト スクリプトを実行する時間を割いている理由は、テスト ケース ソリューション (Testuff) ソフトウェアが、Selenium テスト ケースの自動化によって実行された隣接するテスト ケースを API 呼び出しで更新できるようにするためです。

API 呼び出しを含むコードの例を次に示します。

ありがとう。

from selenium import selenium
import unittest, time, re

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        self.selenium.start()

    def test_python_script(self):
        sel = self.selenium
from selenium import selenium
import unittest, time, re, urllib

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        self.selenium.start()


    def test_python_script(self):
        sel = self.selenium
        sel.open("http://192.168.48.23/labmatrix")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='username']"):
                    break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.type("//*[@name='username']", "username")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='password']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            #self.fail("time out")
        sel.type("//*[@name='password']", "password")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='submitButton']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff test_id number","status" : "failed"}
            result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.click("//*[@id='submitButton']")
        #time.sleep(0.1)
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"):
                    fields = {"test_id" : "testuff test_id number","status" : "passed"}
                    result = urllib.urlopen("testuff api url", urllib.urlencode(fields))
                    print result.read()
                    break
            except: pass
            #time.sleep(1)
        else:
            self.fail("time out")

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

迅速な返答に感謝致します。このコードでjcfollowerの推奨事項を試しました:

from selenium import selenium
import unittest, time, re

class python_script(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "Testing Website URL")
        self.selenium.start()

    def test_python_script_1(self):
        sel = self.selenium


    def test_python_script_2(self):
        sel = self.selenium
        sel.open("Testing website URL")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='username']"):
                    break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "Testuff API Test_id","status" : "failed"}
            result = urllib.urlopen("API URL", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.type("//*[@name='username']", "username")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@name='password']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff API test_id","status" : "failed"}
            result = urllib.urlopen("testuff API url", urllib.urlencode(fields))
            print result.read()
            #self.fail("time out")
        sel.type("//*[@name='password']", "password")
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='submitButton']"): break
            except: pass
            #time.sleep(1)
        else:
            fields = {"test_id" : "testuff API test_id","status" : "failed"}
            result = urllib.urlopen("API URL", urllib.urlencode(fields))
            print result.read()
            self.fail("time out")
        sel.click("//*[@id='submitButton']")
        #time.sleep(0.1)
        for i in range(60):
            try:
                if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"):
                    fields = {"test_id" : "testuff API test_id","status" : "passed"}
                    result = urllib.urlopen("API URL", urllib.urlencode(fields))
                    print result.read()
                    break
            except: pass
            #time.sleep(1)
        else:
            self.fail("time out")

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

...残念ながら、ブラウザ ウィンドウは閉じたままです。他の提案はありますか?

ありがとう。


部分的に動作するようになりました。

次のいずれかを削除しました。

if __name__ == "__main__":
    unittest.main()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

...そして以下を削除しました:

        self.selenium.stop()

残りの " if __name__" ステートメントから、Python ログとブラウザ ウィンドウが開いたままになります。これは正しい方向への一歩ですが、スクリプトの実行が完了したら、ログ ウィンドウを閉じる必要があります。

次のステップは、別の停止クラスを作成し、それを selenium.py ファイルで少し試して、コマンドを削除してブラウザを閉じることができるかどうかを確認することだと思います。

誰かが他に何か提案があれば、大いに感謝します。

4

2 に答える 2

1

毎回 firefox が再起動される理由は、setUp が各単体テスト関数が呼び出される前に呼び出されるためです (同様に、tearDown の後)。したがって、単体テストでは、テストごとに新しい Selenium ブラウザー インスタンスを作成するだけです。必ずしも悪いことではありませんが、同じブラウザー セッションを再利用する方が高速な場合があります。

これを克服するには、代わりに setUpClass / TeaDownClass クラス メソッドを次のように使用できます。

class python_script(unittest.TestCase):
    @classmethod
    def setUpClass(cls)
        cls.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/")
        cls.selenium.start()

    def setUp(self):
        self.verificationErrors = []

    def test_python_script_1(self):
        ...

    def test_python_script_2(self):
        ...

    def tearDown(self):
        self.assertEqual([], self.verificationErrors)

    @classmethod
    def tearDownClass(cls):
        cls.selenium.stop()

setUpClass と tearDownClass は python 2.7 でのみ導入されたことに注意してください! 古いバージョンの python を使用している場合は、引き続き使用できますが、unittest2というライブラリをインストールする必要があります。インストール後、スクリプトの上部にあるインポート行を次のように変更するだけです。

import unittest2 as unittest
于 2011-09-01T17:42:35.113 に答える
0

import ステートメントの 2 番目のセット、2 番目の Class ステートメント、および 2 番目の setUp 関数を削除し、test_python_script 関数の名前を変更して、それらの末尾に _1 と _2 を付けると機能します。

于 2011-08-29T19:38:18.970 に答える