【问题标题】:Running functions in a python script in order在 python 脚本中按顺序运行函数
【发布时间】:2017-12-26 12:16:50
【问题描述】:

我正在使用 selenium webdriver 创建一个用 python 编写的测试套件。但是,当我运行测试时,我收到以下错误消息:'PythonOrgSearch' object has no attribute '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()

编辑:我在每个函数的开头添加了 driver=self.driver

【问题讨论】:

  • 你不想在课堂上到处使用 self.driver 吗?
  • 如果您以某种方式并行运行测试,它们可能会出现乱序。你?此外,驱动程序在setUp在每个测试之前启动;无论它们以什么顺序运行,当驱动程序未启动时,不应运行任何测试。由于多个测试并行运行,打开/关闭可能会干扰,因为您可能只运行一个浏览器。

标签: python unit-testing selenium selenium-webdriver python-unittest


【解决方案1】:

好的,我用一种变通方法解决了这个问题。 虽然函数没有按顺序运行,但每次运行的顺序都是一样的,所以我把 driver.quit() 放在最后运行的函数的末尾。我还(如编辑中所述)将 driver=self.driver 添加到每个函数的顶部。正如其他发帖者所回应的那样,在类中放置一个 init 方法会更好。

此解决方案可能不是最佳做法,但确实有效。对于有类似问题的人,此线程中的其他回复确实可以深入了解该问题,但我只是没有找到解决我问题的答案。

【讨论】:

  • 您应该在 setUp 和 tearDowns 方法中实例化和关闭驱动程序。
【解决方案2】:

看起来您从未初始化 self.driver 变量。在 PythonOrgSearch 类中是否有一个 __init__ 方法来声明一个?

【讨论】:

  • 哦,我刚刚解决了我的想法。我在每个函数的开头添加了 driver=self.driver
  • init 方法是什么意思?我对python不是很熟悉。
  • 我认为你所做的理论上应该可行,但实例变量(self.whatever)通常在 init 方法中定义。这个方法基本上就是每次创建类的实例时运行的方法。当你添加 driver=self.driver 有什么改变吗?
  • 是的,测试现在运行良好,除了浏览器永远不会关闭,我假设这意味着驱动程序没有退出。这是一个问题,因为我将测试作为自动化测试集成到构建和部署系统中,所以在驱动程序完成之前它不知道测试何时完成
猜你喜欢
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2017-09-07
相关资源
最近更新 更多