2016-04-29 12 views
1

私は実際にこの問題を解決する方法を試していますが、ここには私のために働くことができる専門家がいると確信しています:)Python SeleniumテストスイートシングルWebdriverインスタンス?

私はすべてが互いに続いているが、個々のスクリプトであるpythonのテストケースの数です。これらを組み合わせて、1つのwebdriverインスタンスで順番に実行したいと思いますが、動作しないようですそれを行う方法を...

私はテストスイートを作成している -

import unittest 

from Searchfieldreturnscorrectvalue import SearchFieldReturnsCorrectValue 

from Navigatetostreetlightprecontentpage import Navigatetostreetlightprecontentpage 


class TestSuite(unittest.TestSuite): 

    def suite(): 
    suite = unittest.TestSuite() 
suite.addTest(Searchfieldreturnscorrectvalue('test_searchfieldreturnscorrectvalue')) 
suite.addTest(Navigatetostreetlightprecontentpage('test_navigatetostreetlightprecontentpage')) 
return suite 

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

これは、テストを実行しますが、もう一つはそれとして失敗しましたSearchfieldreturnscorrectvalue.py

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import unittest, time, re 

class SearchFieldReturnsCorrectValue(unittest.TestCase): 
def setUp(self): 
    self.driver = webdriver.Firefox() 
    self.driver.implicitly_wait(30) 
    self.base_url = "https://www.XXXXX.com/" 
    self.verificationErrors = [] 
    self.accept_next_alert = True 

def test_search_field_returns_correct_value(self): 
    driver = self.driver 
    driver.get(self.base_url + "/") 
    driver.find_element_by_id("edit-search-block-form--2").click() 
    driver.find_element_by_id("edit-query").clear() 
    driver.find_element_by_id("edit-query").send_keys("street light") 
    driver.find_element_by_id("edit-query").send_keys(Keys.ENTER) 
    for i in range(60): 
     try: 
      if self.is_element_present(By.LINK_TEXT, "Street lighting"): break 
     except: pass 
     time.sleep(1) 
    else: self.fail("time out") 
    try: self.assertEqual("Street lighting", driver.find_element_by_link_text("Street lighting").text) 
    except AssertionError as e: self.verificationErrors.append(str(e)) 

def is_element_present(self, how, what): 
    try: self.driver.find_element(by=how, value=what) 
    except NoSuchElementException as e: return False 
    return True 

def is_alert_present(self): 
    try: self.driver.switch_to_alert() 
    except NoAlertPresentException as e: return False 
    return True 

def close_alert_and_get_its_text(self): 
    try: 
     alert = self.driver.switch_to_alert() 
     alert_text = alert.text 
     if self.accept_next_alert: 
      alert.accept() 
     else: 
      alert.dismiss() 
     return alert_text 
    finally: self.accept_next_alert = True 

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

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

Navigatetostreetlightprecontentpage.pyを..二Firefoxのインスタンスでそれを実行

しようとした

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import unittest, time, re 

class Navigatetostreetlightprecontentpage(unittest.TestCase): 
def setUp(self): 
    self.driver = webdriver.Firefox() 
    self.verificationErrors = [] 
    self.accept_next_alert = True 

def test_navigatetostreetlightprecontentpage(self): 
    driver = self.driver 
    driver.find_element_by_link_text("Street lighting").click() 
    try: self.assertEqual("Street lighting", driver.find_element_by_css_selector("h1.page-title__main__title").text) 
    except AssertionError as e: self.verificationErrors.append(str(e)) 
    try: self.assertEqual("Report a faulty street light | Cheshire East", driver.title) 
    except AssertionError as e: self.verificationErrors.append(str(e)) 

def is_element_present(self, how, what): 
    try: self.driver.find_element(by=how, value=what) 
    except NoSuchElementException as e: return False 
    return True 

def is_alert_present(self): 
    try: self.driver.switch_to_alert() 
    except NoAlertPresentException as e: return False 
    return True 

def close_alert_and_get_its_text(self): 
    try: 
     alert = self.driver.switch_to_alert() 
     alert_text = alert.text 
     if self.accept_next_alert: 
      alert.accept() 
     else: 
      alert.dismiss() 
     return alert_text 
    finally: self.accept_next_alert = True 

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

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

テストスイートを実行する正しい方法であれば、私にはわかりませんそれだけで、すべてのテストを1つのファイルにまとめることができますが、私はまだ "Classes/Tests"が個別に合格/不合格を報告したいと思っています。 setUp(self)をsetUpModuleに移動して共有する必要がありますか?しかし、私はそれを解決することはできません、誰かが正しい方向に私を指すことができる場合は、私は非常に感謝します。

おかげ

更新

私はまだ働いていない、コメント怒鳴るあたりとして疲れて持っているものの例..

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import unittest, time, re 

class SeleniumTest(unittest.TestCase): 
@classmethod 
def setUpClass(cls): 
    cls.driver = webdriver.Firefox() 
    cls.driver.maximize_window() 

@classmethod 
def tearDownClass(cls): 
    cls.driver.close() 
    cls.driver.quit() 

class SearchFieldReturnsCorrectValue(SeleniumTest): 
def setUp(cls): 
    cls.base_url = "https://www.XXXXX.com" 
    cls.verificationErrors = [] 
    cls.accept_next_alert = True 

def test_search_field_returns_correct_value(cls): 
    driver = cls.driver 
    driver.get(cls.base_url + "/") 
    driver.find_element_by_id("edit-search-block-form--2").click() 
    driver.find_element_by_id("edit-query").clear() 
    driver.find_element_by_id("edit-query").send_keys("street light") 
    driver.find_element_by_id("edit-query").send_keys(Keys.ENTER) 
    for i in range(60): 
     try: 
      if cls.is_element_present(By.LINK_TEXT, "Street lighting"): break 
     except: pass 
     time.sleep(1) 
    else: cls.fail("time out") 
    try: cls.assertEqual("Street lighting", driver.find_element_by_link_text("Street lighting").text) 
    except AssertionError as e: cls.verificationErrors.append(str(e)) 
    driver.find_element_by_link_text("Street lighting").click() 

def is_element_present(cls, how, what): 
    try: cls.driver.find_element(by=how, value=what) 
    except NoSuchElementException as e: return False 
    return True 

def is_alert_present(cls): 
    try: cls.driver.switch_to_alert() 
    except NoAlertPresentException as e: return False 
    return True 

def close_alert_and_get_its_text(cls): 
    try: 
     alert = cls.driver.switch_to_alert() 
     alert_text = alert.text 
     if cls.accept_next_alert: 
      alert.accept() 
     else: 
      alert.dismiss() 
     return alert_text 
    finally: cls.accept_next_alert = True 

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


class Navigatetostreetlightprecontentpage(SeleniumTest): 
def setUp(cls): 
    cls.verificationErrors = [] 
    cls.accept_next_alert = True 

def test_navigatetostreetlightprecontentpage(cls): 
    driver = cls.driver 
    try: cls.assertEqual("Street lighting", driver.find_element_by_css_selector("h1.page-title__main__title").text) 
    except AssertionError as e: cls.verificationErrors.append(str(e)) 
    try: cls.assertEqual("Report a faulty street light | Cheshire East", driver.title) 
    except AssertionError as e: cls.verificationErrors.append(str(e)) 

def is_element_present(cls, how, what): 
    try: cls.driver.find_element(by=how, value=what) 
    except NoSuchElementException as e: return False 
    return True 

def is_alert_present(cls): 
    try: cls.driver.switch_to_alert() 
    except NoAlertPresentException as e: return False 
    return True 

def close_alert_and_get_its_text(cls): 
    try: 
     alert = cls.driver.switch_to_alert() 
     alert_text = alert.text 
     if cls.accept_next_alert: 
      alert.accept() 
     else: 
      alert.dismiss() 
     return alert_text 
    finally: cls.accept_next_alert = True 

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

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

これは今両方のクラスを実行しているように見えるが、2番目のクラス要素を見つけることは決してできませんが、ファーストクラスの同じ行は完全に機能します。

答えて

3

私はよく理解わからないが、単一のドライバのインスタンスを使用して、あなたがドライバを作成setupClassクラスのメソッドを使用することができます。

class MyTestClass(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     cls.driver = webdriver.Firefox() 

    @classmethod 
    def tearDownClass(cls): 
     cls.driver.close() 
     cls.driver.quit() 

    def setUp(self): 
     .... 

それはまだすべての新しいテスト用のドライバを再作成しますしかし、それはすべてのテストのために1つを再作成しません(setUpのように)。

Personnally私はすべての私のテストクラスは、このようなSeleniumTestクラスから継承します:私は私はあなたが何を意味するかを理解すると思う

class SeleniumTest(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     cls.driver = webdriver.Firefox() 

    @classmethod 
    def tearDownClass(cls): 
     cls.driver.close() 
     cls.driver.quit() 

class MyTestClass(SeleniumTest): 
    def setUp(self): 
     .... 
+0

私は今、これを使用して一緒に2を結合しようとしましたが、私は私の元を更新します私は今持っているものとの質問をしますが、ファーストクラスを修了した後は2クラス/テストを実行していないようです。 – Karl

+0

'cls.driver.maximize_window()'も 'setupClass'の中に入ります。それとは別に、私はなぜあなたの第二のクラスが実行されないのか分かりません。どのようにテストを呼びますか?私はpytestを使用し、それはすべてうまく動作します。 'setupClass'は新しいクラスごとにドライバを作り直してくれます。ちょうどすべてのテストのために1つを作り直すだけです(' setUp'のように)。 – JulienD

+0

2番目のテストクラスをSeleniumTestから継承することを忘れたのでしょうか? – JulienD

関連する問題