在python或其他文件中从类外部调用函数

时间:2014-08-15 20:45:03

标签: python inheritance selenium-webdriver

在下面的代码中,如何从类外部或从python中的另一个文件调用函数open_url()

from selenium import selenium
import unittest, time, re
from selenium import webdriver

seed_url="http://www.google.com"
class Test(unittest.TestCase):

    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "https://www.google.com/")
        self.selenium.start()

    def test_urlfunctions(self):
        sel = self.selenium
        sel = webdriver.Firefox()

        def open_url(url):
            sel.get(url)

        open_url(seed_url)

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


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

1 个答案:

答案 0 :(得分:1)

一般情况下,这是一个正常的"上课和正常"方法,你可以实例化对象,然后简单地调用它。

foo = Test()
foo.open_url()

然而,这个类并不打算以这种方式使用,因为它只有一个默认的构造函数,虽然它会创建一个对象的实例,但它本质上是空的,虽然我想你可以明确地调用另一个自己发挥作用。

相反,这个类看起来像是由测试框架(可能是 nose )使用,它会自动调用setUptearDown方法适当时,然后自动运行测试方法。

此外,如果您的缩进正确,此特定方法open_url的范围限定为test_urlfunctions函数,因此您无法从课外调用它,除非您是经历一些扭曲,例如让test_urlfunctions方法返回可以在其他地方使用的函数。但是,这将使得它在本地范围内并使此设置与测试框架一起使用失败。

例如,这是一个较小的例子。鉴于此代码:

class Foo:
    def bar(self):
        print "in bar"

        def inner_bar():
            print "in inner_bar"

        inner_bar()


if __name__ == "__main__":
    foo = Foo()
    foo.bar()
    foo.inner_bar()

这导致以下输出:

in bar
in inner_bar
Traceback (most recent call last):
  File "so_class.py", line 14, in <module>
    foo.inner_bar()
AttributeError: Foo instance has no attribute 'inner_bar'

这表明inner_bar()无法通过对象本身从外部调用。

你想要完成什么?你为什么要这样做?

根据OP的评论进行编辑:

如果你想在测试框架的上下文之外运行 Selenium ,你可以通过不继承unittest并重新调整函数以及如何调用它们来将它与它分离(因为它们将不再被测试框架自动调用。)

但是,您说您希望使用selenium webdriver测试框架制作一个网络抓取工具,这并不是真的有意义。 Selenium 用于自动化Web浏览器,通常(尽管不总是)用于测试。实际上,您可能希望查看scrapy之类的内容,这是专为屏幕抓取和网络抓取而设计的。