我有一种方法可以抓取网页并将数据保存到文件中(参见下面的示例代码)。我需要测试生成的数据是否格式正确。
问题是,数据是从一系列调用中接收的,并且进一步的调用使用之前调用的结果。更糟糕的是,所涉及的许多调用都是在具有不同参数的相同对象(a Webdriver
、aWebDriverWait
和expected_conditions
模块)上完成的。
我看到unittest.mock.Mock
可以mock一个简单调用的结果,或者一系列简单调用的结果,但是看不出怎么实现这样纠结的东西。我看到的唯一方法是手动重新实现该方法进行的每个调用,并将我在该方法中传递的参数复制到这些实现中,以便他们知道每次调用要返回什么。并为所有其他测试用例再次执行此操作。这听起来绝对是编写和维护的噩梦:代码比测试本身多几倍,并且与代码接近 1:1 重复。所以我拒绝继续,直到有人告诉我有更好的方法或证明没有更好的方法并且每个人都真的这样做(我不相信)并且例如每次页面上的标签更改时重写所有测试(这是一个实现细节,所以通常,它应该
示例代码(适用于http://example.com):
import selenium.webdriver
from selenium.webdriver.common.by import By as by
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def dump_accreditation_data(d, w, i, path):
f = codecs.open(os.path.join(path, "%d.txt" % i), "w", encoding="utf-8")
u = u'http://example.com/%s/accreditation' % i
d.get(u)
# page load
w.until(EC.visibility_of_element_located((by.XPATH,"//p"))) #the real code has a more complex expression here with national characters
w.until_not(EC.visibility_of_element_located((by.CSS_SELECTOR, '.waiter')))
print >> f, u
# organization name
e = w.until(EC.visibility_of_element_located((
by.CSS_SELECTOR, 'h1'
)))
org_name = e.text
print >> f, org_name
del e
#etc
e = d.find_element_by_xpath(u'//a[text()="More information..."')
print >> f, e.get_attribute('href')
#How it's supposed to be used:
d = selenium.webdriver.Firefox()
w = WebDriverWait(d, 10)
dump_accreditation_data(d, w, 123, "<output_path>")