簡體   English   中英

Python Selenium Test Suite單個Webdriver實例?

[英]Python Selenium Test Suite Single Webdriver Instance?

我有一些真正的問題試圖找出如何讓這個工作,我相信這里有一些專家可以為我解決,請:)

所以我在python中有很多測試用例,它們都是相互依賴的,但是是個別的腳本,我想把它們組合起來並按順序運行它們,在一個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()

這運行測試,但第二個失敗,因為它試圖在第二個firefox實例中運行它。

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

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()

我不知道測試套件是否是正確的方法,或者只是將所有測試都放到一個文件中,但我仍然希望“類/測試”單獨報告通過/失敗,此刻我無法讓它工作,我認為這與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()

這似乎現在正在運行這兩個類,但第二個類永遠不能找到任何元素,但第一個類中的同一行完美地工作。

我不確定我是否理解,但是要使用單個驅動程序實例,您可以使用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):
         ....

它仍將為每個新測試類重新創建驅動程序,但它不會為每個測試重新創建一個(如setUp所做的那樣)。

我個人將所有測試類繼承自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):
         ....

進口單位測試

來自selenium import webdriver的時間導入睡眠類SeleniumTest(unittest.TestCase):

global driver

@classmethod
def setUpClass(cls):
    #getting a common webdriver instance for all your tests for this module
    cls.driver = webdriver.Chrome("/Users/sibasish/PycharmProjects/CommonDriverInstance/chromedriver")
    cls.driver.get("https://www.google.com")

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

class MyTestClass(SeleniumTest):def setUp(self):pass

def test_sample1(self):
    print("hello1")
    self.driver.get("https://www.google.com/")
    sleep(4)

def test_sample2(self):
    print("hello2")
    self.driver.get("https://www.facebook.com/")
    sleep(4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM