3

私は、Pythonで書かれたテストスイートを、selenium webdriverを使って作成しています。しかし、テストを実行すると、「PythonOrgSearch」オブジェクトに「ドライバ」属性がありません。Pythonスクリプトの関数を順に実行する

テストが順番に実行されていないため、ドライバがテストが完了しました。私は以前にも、「接続を確立せずにコマンドを実行しようとしました」というエラーも受けていました。これは、テストが順番に実行されていないと考えたので、ドライバが起動していないためです。私はこれが正確ではないと確信しています、ちょうど私の最高の推測。私はあなたがself.driver変数を初期化したことがないように見えます各機能

+2

クラス内のどこでもself.driverを使いたくないですか? – PRMoureu

+0

テストを並行して実行すると、テストが順不同で実行される可能性があります。あなたは?また、ドライバは、各テストの前に 'setUp' _で起動されます; _それらがどの順序で実行されても、ドライバが起動されていないときにはテストは実行されません。いくつかのテストを並行して実行すると、1つのブラウザしか実行していない可能性があるため、開閉が干渉する可能性があります。 – 9000

答えて

0

さて、私は回避策を使って問題を解決しました。 関数は順番に実行されませんでしたが、毎回同じ順序で実行されていましたので、最後に実行された関数の最後にdriver.quit()を追加しました。私は(編集に加えて)driver = self.driverを各関数の先頭に追加します。他のポスターが応答したので、のinitメソッドをクラスに追加する方が良いでしょう。

この解像度はベストプラクティスではない可能性がありますが、機能します。同様の問題を抱えている人には、このスレッドの他の回答が問題を把握していますが、問題を解決した回答が見つかりませんでした。

+0

setUpおよびtearDownsメソッドでドライバをインスタンス化して閉じる必要があります。 – Dan

1

の開始時にドライバー= self.driverを追加しました:

import unittest 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import os 
import time 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
from selenium.webdriver.common.action_chains import ActionChains 
from urllib.request import urlopen 
from html.parser import HTMLParser 


gecko = os.path.normpath(os.path.join(os.path.dirname(__file__), 'geckodriver')) 
binary = FirefoxBinary('C:\Program Files (x86)\Mozilla Firefox\Firefox.exe') 
driver = webdriver.Firefox(firefox_binary=binary, executable_path=gecko+'.exe') 


class PythonOrgSearch(unittest.TestCase): 

#sets up driver to run tests 
    def setUp(self): 
     self.driver = driver 
     self.driver.start() 

    def test_opens(self): 
     driver.get("url.com") 
     driver.find_element_by_id('username').send_keys('user') 
     driver.find_element_by_id('password').send_keys('pass') 
     driver.find_elements_by_css_selector("button[type='submit']")[0].click() 
     time.sleep(2); 
     self.assertIn("title", driver.title) 

    def ztearDown(self): 
     self.driver.close() 

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

EDIT:私のコードは次のようになります。あなたはPythonOrgSearchクラスの中に__init__メソッドを持っていますか?

+0

オハイオ州私はちょうど私が考えて固定。各機能の開始時にdriver = self.driverを追加しました –

+0

initメソッドはどういう意味ですか?私はPythonに精通していない。 –

+0

私はあなたがしていることは理論的にはうまくいくと思いますが、インスタンス変数(self.whatever)は通常__init__メソッドで定義されています。このメソッドは基本的に、クラスのインスタンスが作成されるたびに実行されるものです。 driver = self.driverを追加したときに何か変わったのですか? –

関連する問題