前言
这里是清安,上一章我们讲了Expected_conditions的部分用法,本章文们来说说剩下的用法。
❝本章我们换种方式,从源码入手。代码大体还是与上一章类似,所以本章只贴方法出来了,各位自己写的时候记得写入类中。「后续会将源码全部贴出」
❞
text_to_be_present_in_element
检查给定文本是否存在于指定的元素。「先看源码」
def __init__(self, locator, text_): self.locator = locator self.text = text_ def __call__(self, driver): try: element_text = _find_element(driver, self.locator).text return self.text in element_text except StaleElementReferenceException: return False
以最简单最快的方式来看,__call__这个魔术方法里面有这么一个_find_element方法,那么他实际源码是这样的:
def _find_element(driver, by): try: return driver.find_element(*by) except NoSuchElementException as e: raise e except WebDriverException as e: raise e
什么意思呢返回这个定位元素方法,如果没有测抛出异常,具体何异常就是代码中的raise e了。好了,简单的了解这个后,回到上述的代码中_find_element(driver, self.locator).text,这里传入的是定位元素。「实际顺序是__call__里面调用了_find_element函数,并传入了所需要的值,最后通过.text获取到文本值」最后做一个判断,判断传入的text_文本值是否在元素获取到的文本值中。所以我们来看看类中的方法如何写的
def text_element(self,text,*ele): self.wait.until(EC.text_to_be_present_in_element(ele, text),message='请检查定位的文本值') if __name__ == '__main__': b = Brouser() b.text_element('新用户',By.CLASS_NAME, 'reg_btn') b.text_element('注册新用户',By.CLASS_NAME, 'reg_btn')
因为源码是判断传入的字符串是否在获取到的字符里面,所以我们可以全写,也可以不全写。不过这里建议全写。
text_to_be_present_in_element_value
检查给定文本是否存在于元素的。看着是不是跟上述很相似。那么看看源码:
class text_to_be_present_in_element_value(object): def __init__(self, locator, text_): self.locator = locator self.text = text_ def __call__(self, driver): try: element_text = _find_element(driver, self.locator).get_attribute("value") if element_text: return self.text in element_text else: return False except StaleElementReferenceException: return False
同样直接看__call__这个魔术方法里面,调用了_find_element函数,传入定位元素。***注意了,不同的是这里获取的是属性值get_attribute("value")***也就是获取的是value所对应的属性值。
def text_element_value(self,text,*ele): self.wait.until(EC.text_to_be_present_in_element_value(ele, text),message='请检查对应的value属性值哦') if __name__ == '__main__': b = Brouser() b.text_element_value('登录',By.CLASS_NAME,'input_submit')
frame_to_be_available_and_switch_to_it
这个就不依靠翻译了,简单点理解就是如果检测到了frame框架,就进行切换。看源码
class frame_to_be_available_and_switch_to_it(object): def __init__(self, locator): self.frame_locator = locator def __call__(self, driver): try: if isinstance(self.frame_locator, tuple): driver.switch_to.frame(_find_element(driver, self.frame_locator)) else: driver.switch_to.frame(self.frame_locator) return True except NoSuchFrameException: return False
其他都同上面说的两种方式一样,唯一需要说明的就是「isinstance,检查是否属于某类型,这里写的是tuple,检查是否是元组」如果是测进入切换,否则,进入else进行切换。我们这里换一个网址测试一下:
def frame_switch_to(self,*ele): self.wait.until(EC.frame_to_be_available_and_switch_to_it(ele),message='请检查元素') if __name__ == '__main__': b = Brouser() b.get_url('https://login.tmall.com/') b.frame_switch_to(By.ID,'J_loginIframe') t = b.fox.find_element(By.CLASS_NAME,'forgot-password-a-link').text print(t)
这里用的是天猫的登录界面,frame框架,一般也多用于的登录界面。先切换到frame框架,然后再定位里面的元素,上述代码已经做出示例。「如果还不懂frame,可以翻阅一下系列问WEB中的文章,详细教你如何定位frame」
invisibility_of_element_located
这个就不看源码了,用于判断某个元素不存在DOM上或不可见的。可以理解为用于异常情况的。
❝通俗的理解就是,如果不存在或者不可见那么就为True,正常情况,要是可见,或者存在那就是异常的。
❞
def invisibility_element(self,*ele): self.wait.until(EC.invisibility_of_element_located(ele), message='请检查元素是否正确') if __name__ == '__main__': b = Brouser() b.get_url('http://shop.aircheng.com/simple/login') b.invisibility_element(By.CLASS_NAME,'ddd')
element_to_be_clickable
检查元素的预期是可见的,并已启用,以便您可以单击它。「先看源码」
class element_to_be_clickable(object): def __init__(self, locator): self.locator = locator def __call__(self, driver): element = visibility_of_element_located(self.locator)(driver) if element and element.is_enabled(): return element else: return False
源码还是老套路,不同的就是调用了之前我们讲过的其中的一个方法visibility_of_element_located,先检查了一次界面元素,其次还「做了一个判断element.is_enabled(),判断元素是否被使用」测试一下看看如何使用
def element_clickable(self,*ele): """元素是否可以点击""" ele = self.wait.until(EC.element_to_be_clickable(ele),message='请检查元素是否正确') ele.click() if __name__ == '__main__': b = Brouser() b.get_url('http://shop.aircheng.com/simple/login') b.element_clickable(By.NAME, 'remember')
上述代码 意思就是判断元素可以点击后,直接调用click()方法点击一次。
staleness_of
这个方法,也是同上述所说的invisibility_of_element_located类似,如果正常反而会给你抛出异常,如果错误,反而给你返回 True。「判断元素是否从DOM中移除」看看源码
class staleness_of(object): def __init__(self, element): self.element = element def __call__(self, ignored): try: self.element.is_enabled() return False except StaleElementReferenceException: return True
代码中做了一个.is_enabled()的判断,如果被选中,那么返回False。反之True。「此外,此方法需要传入一个元素对象进去」具体的示例网站没有找到,如果你有可以私信我。这个方法可以用来判断网站是否刷新,亦或者其他作用欢迎私信。但是,如果你不想应为这个方法判断而报错这里推荐使用until_not或者忽略掉这个方法
def staleness_(self,*ele): self.wait.until_not(EC.staleness_of(self.fox.find_element(ele))) if __name__ == '__main__': b = Brouser() b.get_url('http://shop.aircheng.com/simple/login') b.staleness_(By.NAME,'remember')
本章就到这,下一章我们一起看看下拉列表以及alert等方法是使用。