【问题标题】:Python Selenium Test Suite Single Webdriver Instance?Python Selenium 测试套件单个 Webdriver 实例?
【发布时间】:2018-12-07 15:24:03
【问题描述】:

我在试图弄清楚如何让它发挥作用时遇到了一些实际问题,我相信这里有一些专家可以为我解决这个问题,拜托:)

因此,我在 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()

我不知道测试套件是否是正确的方法,或者只是将所有测试放入一个文件中,但我仍然希望“类/测试”单独报告通过/失败,在当我无法让它工作时,我认为这与需要移动到 setUpModule 并共享的 setUp(self) 有关吗?但我无法解决,如果有人能指出我正确的方向,我将非常感激。

谢谢

更新

根据下面的评论,我已经厌倦了,但仍然无法正常工作..

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

现在这两个类似乎都在运行,但第二个类永远无法定位任何元素,但第一个类中的同一行完美运行。

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    我不确定我理解得很好,但是要使用单个驱动程序实例,您可以使用创建驱动程序的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):
             ....
    

    【讨论】:

    • 我想我明白你的意思,我现在已经尝试将这两个结合在一起,我将用我现在拥有的内容更新我原来的问题,但它似乎没有运行第二个完成第一堂课后上课/考试?
    • cls.driver.maximize_window() 也应该进入setupClass。除此之外,我不知道为什么你的第二节课不上。你怎么称呼测试?我使用 pytest,它运行良好。请注意,setupClass 将为每个新类重新创建驱动程序,只是它不会为每个测试重新创建一个驱动程序(就像 setUp 所做的那样)。
    • 也许你忘了让第二个测试类也继承自 SeleniumTest ?
    • 好的,谢谢,我会再次检查并在回到办公室后重试,我正在使用集成了 PyDev 的 LiClipse?
    • 你好,我改了一些代码,现在运行第二个类,问题是,它找不到任何元素,不管我在第二个类中放什么,它永远无法找到元素,但是如果我将“查找”移到第一类,它会立即起作用,您能想到任何原因吗?我将使用我现在拥有的版本更新我的编辑。感谢您的帮助 JulienD
    【解决方案2】:

    导入单元测试

    从硒导入网络驱动程序 从时间导入睡眠 类 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()
    

    类 MyTestClass(SeleniumTest): 默认设置(自我): 通过

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多