按顺序在python脚本中运行函数

时间:2017-07-20 16:53:47

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

我正在使用selenium webdriver创建一个用python编写的测试套件。但是,当我运行测试时,我得到的错误是:' PythonOrgSearch'对象没有属性' 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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

好的,我用解决方法解决了这个问题。 虽然这些函数没有按顺序运行,但它们每次都以相同的顺序运行,所以我将driver.quit()放在最后运行的函数的末尾。我也(如编辑中所示)将driver = self.driver添加到每个函数的顶部。正如其他海报作出回应一样,在课堂上设置 init 方法会更好。

此解决方案可能不是最佳做法,但确实有效。对于有类似问题的人,此线程中的其他响应确实可以对问题有所了解,我只是找不到解决问题的方法。