def step_impl(context, nombre): rows = context.driver.find_elements_by_tag_name('tr') dinosaurios = [] for row in rows[1:]: td_dino = row.find_elements_by_tag_name('td') dinosaurios.append(td_dino[1].text) test = TestCase() test.assertNotIn(nombre, dinosaurios)
def assert_string_notin_pagesource(assertString): global driver try: PageSource = driver.page_source TestCase.assertNotIn(None,assertString,PageSource,'错误:文本出现在页面中') except AssertionError as e: raise AssertionError(e) except Exception as e: raise e
def assert_file_does_not_contain(filename: str, search_string: str, test_case: unittest.TestCase): with open(filename, 'r') as file: current_line = "\n" num_lines = 0 while current_line: current_line = file.readline() num_lines += 1 test_case.assertNotIn(search_string, current_line) test_case.assertGreater(num_lines, 1)
def test_deleteHuds(self): TestCase.assertIn(self, self.game.tilemap.layers.by_name['playerHud'], self.game.tilemap.layers) TestCase.assertIn(self, 'playerHud', self.game.tilemap.layers.by_name) # TODO: deleteHuds devrait retourner ce qu'il enleve pour simplifier # les tests. self.game.deleteHuds() TestCase.assertNotIn(self, 'playerHud', self.game.tilemap.layers.by_name)
def check_response(test: unittest.TestCase, res: requests.Response, content_type: str = None): res_data = None if content_type is None: test.assertNotIn('Content-Type', res.headers) else: test.assertIn('Content-Type', res.headers) test.assertEqual(res.headers['Content-Type'], content_type + '; charset=utf-8') test.assertNotEqual(len(res.text), 0) if content_type == 'text/html': res_data = res.text elif content_type == 'application/json': res_data = res.json() else: raise ValueError() return res_data
def test_stress_testing(): tc = TestCase() def check_balance(t): tc.assertLess(abs(height(t.left) - height(t.right)), 2, 'Tree is out of balance') t = AVLTree() vals = list(range(1000)) random.shuffle(vals) for i in range(len(vals)): t.add(vals[i]) for x in vals[:i+1]: tc.assertIn(x, t, 'Element added not in tree') traverse(t.root, check_balance) random.shuffle(vals) for i in range(len(vals)): del t[vals[i]] for x in vals[i+1:]: tc.assertIn(x, t, 'Incorrect element removed from tree') for x in vals[:i+1]: tc.assertNotIn(x, t, 'Element removed still in tree') traverse(t.root, check_balance)
else: return max(1 + height(t.left), 1 + height(t.right)) def check_balance(t): tc.assertLess(abs(height(t.left) - height(t.right)), 2, 'Tree is out of balance') t = AVLTree() vals = list(range(1000)) random.shuffle(vals) for i in range(len(vals)): t.add(vals[i]) for x in vals[:i + 1]: tc.assertIn(x, t, 'Element added not in tree') traverse(t.root, check_balance) random.shuffle(vals) for i in range(len(vals)): del t[vals[i]] for x in vals[i + 1:]: tc.assertIn(x, t, 'Incorrect element removed from tree') for x in vals[:i + 1]: tc.assertNotIn(x, t, 'Element removed still in tree') traverse(t.root, check_balance) # In[ ]: # In[ ]:
def assertNotIn(self, member, container, msg=None): if hasattr(TestCase, 'assertNotIn'): return TestCase.assertNotIn(self, member, container, msg) return self.assertFalse(member in container)
def should_not_contains(test: unittest.TestCase, except_value, real_value): return test.assertNotIn(except_value, real_value)
class BasePage(object): """ 定一个基类,所有的页面都需要继承此类,会在此类中,封装selenium很大一部分操作页面操作方法 注意: 1.所有页面创建的时候,都需要继承与此类 2.此类中的driver仅仅是变量,在所有页面创建的时候,需要先使用browser_engine.py打开页面,之后方可使用本类中封装的方法 3.用以上的方法来确保前后操作driver的一致性(重要!) """ def __init__(self, driver): self.driver = driver self._element_finder = ElementFinder() self._test_case = TestCase() # 查找元素 def _element_find(self, locator, first_only, required, tag=None): if isinstance(locator, str): elements = self._element_finder.find(self.driver, locator, tag) if required and len(elements) == 0: raise ValueError("Element locator '" + locator + "' did not match any elements.") if first_only: if len(elements) == 0: return None return elements[0] elif isinstance(locator, WebElement): elements = locator # do some other stuff here like deal with list of webelements # ... or raise locator/element specific error if required return elements # 获取元素的文本 def _get_text(self, locator): element = self._element_find(locator, True, True) if element is not None: return element.text return None # 获取元素的值 def _get_value(self, locator, tag=None): element = self._element_find(locator, True, False, tag) return element.get_attribute('value') if element is not None else None # 获取元素的属性 def _get_element_attribute(self, locator, attribute_name, tag=None): element = self._element_find(locator, True, False, tag) return element.get_attribute(attribute_name) # 判断元素是否存在 def _is_element_present(self, locator, tag=None): element = self._element_find(locator, True, False, tag=tag) if element is not None: return True return False # 打开url操作 def open_url(self, url=config.URL, implicitly_wait_time=config.IMPLICITLY_WAIT_TIME): self.driver.get(url) logger.info("open url '%s'" % url) self.driver.maximize_window() self.set_implicitly_wait_time(implicitly_wait_time) # 设置浏览器隐式等待时间 def set_implicitly_wait_time( self, implicitly_wait_time=config.IMPLICITLY_WAIT_TIME): self.driver.implicitly_wait(implicitly_wait_time) logger.info("set implicitly wait time %s" % implicitly_wait_time) # 退出浏览器操作 def quit_browser(self): self.driver.quit() logger.info("quit browser") # 浏览器前进操作 def forward(self): self.driver.forward() logger.info("forward operation") # 浏览器后退操作 def back(self): self.driver.back() logger.info("back operation") # 校验方法---------------------------------------------------------------------------------------------------------- # 验证元素包含文本 def element_should_contain(self, locator, expected, message=''): logger.info("Verifying element '%s' contains text '%s'." % (locator, expected)) actual = self._get_text(locator) if not message: message = "Element '%s' should have contained text '%s' but its text was '%s'." % ( locator, expected, actual) self._test_case.assertIn(expected, actual, message) # 验证元素不包含文本 def element_should_not_contain(self, locator, expected, message=''): logger.info("Verifying element '%s' does not contain text '%s'." % (locator, expected)) actual = self._get_text(locator) if not message: message = "Element '%s' should not contain text '%s' but it did." % ( locator, expected) self._test_case.assertNotIn(expected, actual, message) # 验证元素的文本 def element_text_should_be(self, locator, expected, message=''): logger.info("Verifying element '%s' contains exactly text '%s'." % (locator, expected)) actual = self._get_text(locator) message = "The text of element '%s' should have been '%s' but in fact it was '%s'." % ( locator, expected, actual) self._test_case.assertEqual(expected, actual, message) # 验证元素的属性值 def element_attribute_should_be(self, locator, attribute_name, expected, tag=None, message=''): logger.info( "Verifying element '%s' contains exactly attribute text '%s'." % (locator, expected)) actual = self._get_element_attribute(locator, attribute_name, tag) message = "The attribute text of element '%s' should have been '%s' but in fact it was '%s'." % ( locator, expected, actual) self._test_case.assertEqual(expected, actual, message) # 验证页面包含某元素 def page_should_contain_element(self, locator, tag=None, message=''): if not self._is_element_present(locator, tag): if not message: message = "Page should have contained element '%s' but did not" % locator raise AssertionError(message) logger.info("Current page contains element '%s'." % locator) # 验证页面不包含某元素 def page_should_not_contain_element(self, locator, tag=None, message=''): if self._is_element_present(locator, tag): if not message: message = "Page should not have contained element '%s'" % locator raise AssertionError(message) logger.info("Current page does not contain element '%s'." % locator) # 点击方法---------------------------------------------------------------------------------------------------------- # 点击元素 def click_element(self, locator: object) -> object: logger.info("Clicking element '%s'." % locator) self._element_find(locator, True, True).click() # 点击按钮 def click_button(self, locator): logger.info("Clicking button '%s'." % locator) element = self._element_find(locator, True, False, 'input') if element is None: element = self._element_find(locator, True, True, 'button') element.click() # 文本输入方法------------------------------------------------------------------------------------------------------ # 文本框输入 def input_text(self, locator, text): logger.info("Typing text '%s' into text field '%s'" % (text, locator)) element = self._element_find(locator, True, True) element.clear() element.send_keys(text) def focus(self, locator): element = self._element_find(locator, True, True) ActionChains(self.driver).move_to_element(element).perform() # 显式等待方法------------------------------------------------------------------------------------------------------ # 等待元素加载 def wait_until_page_contains_element( self, locator: object, tag: object = None, error: object = None, timeout: object = config.TIMEOUT) -> object: if not error: error = "Element '%s' did not appear in '%s's." % (locator, timeout) try: WebDriverWait(self.driver, timeout).until( lambda x: self._element_finder.find(x, locator, tag=tag)) logger.info("Wait page contains element '%s'." % locator) except TimeoutException: raise AssertionError(error) # 等待元素消失 def wait_until_page_does_not_contains_element(self, locator, tag=None, error=None, timeout=config.TIMEOUT): if not error: error = "Element '%s' did not disappear in %s" % (locator, timeout) try: WebDriverWait(self.driver, timeout).until_not( lambda x: self._element_finder.find(x, locator, tag=tag)) logger.info("Wait page does not contains element '%s'" % locator) except TimeoutException: raise AssertionError(error) # 截图方法并保存到screenshots目录下 def take_screenshot(self, current_file_path): screen_path = os.path.join( config.SCREENSHOTS_PATH, os.path.basename((os.path.split(current_file_path)[0]))) if not os.path.exists(screen_path): os.makedirs(screen_path) i = 1 screen_name = os.path.basename( os.path.splitext(os.path.realpath(current_file_path)) [0]) + "_" + str(i) + '.png' while os.path.exists(os.path.join(screen_path, screen_name)): i = i + 1 screen_name = os.path.basename( os.path.splitext(os.path.realpath(current_file_path)) [0]) + "_" + str(i) + '.png' try: self.driver.get_screenshot_as_file( os.path.join(screen_path, screen_name)) logger.info("save screenshot name: '%s'" % screen_name) except Exception as e: logger.error(e)