| | 1 | == 如何测试异步实现的功能 == |
| | 2 | 7.0论坛的发帖功能使用ajax异步提交请求,为了验证发帖,我们需要在发帖后,让当前线程睡眠N秒,等待发帖完成,如下: |
| | 3 | [[BR]] |
| | 4 | {{{ |
| | 5 | ...... |
| | 6 | #点击发帖按钮 |
| | 7 | driver.find_element_by_css_selector("div.fatie_action > a > img").click() |
| | 8 | |
| | 9 | #当前线程睡眠10秒,等待发帖完成 |
| | 10 | time.sleep(10) |
| | 11 | |
| | 12 | #断言帖子标题 |
| | 13 | self.assertNotEqual(-1,driver.title.find(title)) |
| | 14 | ...... |
| | 15 | }}} |
| | 16 | 这里有一个问题,10秒,是一个漫长的等待过程,但如果设置1秒呢,发帖并不一定能完成,接下来的断言会失败,而且,10秒只是一个我们估算出来的 |
| | 17 | [[BR]] |
| | 18 | 在大多数情况下,完成发帖所花费的时间。有时,可能10秒也不够,那么发帖到底需要多少时间呢?我们可以开发函数来监控 |
| | 19 | {{{ |
| | 20 | def sleep_until_done(fun, timeout = 30): |
| | 21 | u''' 检查指定的条件是否成熟, 若未成熟则继续sleep,直到超时 ''' |
| | 22 | for v in range(0, timeout): |
| | 23 | if fun(): |
| | 24 | return True |
| | 25 | else: |
| | 26 | time.sleep(1) |
| | 27 | return False |
| | 28 | |
| | 29 | }}} |
| | 30 | 我们知道如果发帖成功,那么浏览器会重定向到帖子页.利用这个检查方法, 现在我们开发条件函数 |
| | 31 | {{{ |
| | 32 | def is_topic_page(self): |
| | 33 | u''' 是否是帖子页 ''' |
| | 34 | driver = self.driver |
| | 35 | topic_url = driver.current_url |
| | 36 | regex = self.base_url + "/topic-" + "\d+\.html" |
| | 37 | match = re.match(regex, topic_url) |
| | 38 | return match is not None |
| | 39 | }}} |
| | 40 | |
| | 41 | 现在,我们来优化一下,发帖的过程 |
| | 42 | {{{ |
| | 43 | ...... |
| | 44 | #点击发帖按钮 |
| | 45 | driver.find_element_by_css_selector("div.fatie_action > a > img").click() |
| | 46 | |
| | 47 | #当前线程休眠,完成发帖过程 |
| | 48 | functions.sleep_until_done(self.is_topic_page) |
| | 49 | |
| | 50 | #断言帖子标题 |
| | 51 | self.assertNotEqual(-1,driver.title.find(title)) |
| | 52 | ...... |
| | 53 | }}} |