在下面的代码中,如何从类外部或从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()
答案 0 :(得分:1)
一般情况下,这是一个正常的"上课和正常"方法,你可以实例化对象,然后简单地调用它。
即
foo = Test()
foo.open_url()
然而,这个类并不打算以这种方式使用,因为它只有一个默认的构造函数,虽然它会创建一个对象的实例,但它本质上是空的,虽然我想你可以明确地调用另一个自己发挥作用。
相反,这个类看起来像是由测试框架(可能是 nose )使用,它会自动调用setUp
和tearDown
方法适当时,然后自动运行测试方法。
此外,如果您的缩进正确,此特定方法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之类的内容,这是专为屏幕抓取和网络抓取而设计的。