前言
这里是清安,显示等待内容咱们本章继续,接着看。
element_to_be_selected
这个方法用来判断元素是否被选中。可以用在下拉列表,也可以用在选项框中。一起看看源码:
class element_to_be_selected(object): def __init__(self, element): self.element = element def __call__(self, ignored): return self.element.is_selected()
这里用到了.is_selected(),这个方法是用来判断是否被选中。此外,此处还必须传入的是一个元素对象。一起看看测试代码:
def element_selected(self,*ele): """判断某个元素是否被选中""" self.wait.until(EC.element_to_be_selected(self.fox.find_element(*ele)),message="元素没有被选中,请检查元素") if __name__ == '__main__': b = Brouser() b.get_url('https://baidu.com') b.fox.find_element(By.ID,'s-usersetting-top').click() b.fox.find_element(By.CLASS_NAME,'set').click() b.fox.find_element(By.ID,'s1_1').click() b.element_selected(By.ID,"s1_1")
老规矩,还是那个类,自行复制进去哦!此处也是切换了例子。
element_located_to_be_selected
class element_located_to_be_selected(object): def __init__(self, locator): self.locator = locator def __call__(self, driver): return _find_element(driver, self.locator).is_selected()
这个就不看测试代码了,后续源码中贴出来,跟上述的一样,只不过这里只需要传入元素即可。因为源码中自带了定位元素对象_find_element(driver, self.locator)。
element_selection_state_to_be
这些都没什么特殊的地方,大体上都类似,直接看源码:
class element_selection_state_to_be(object): def __init__(self, element, is_selected): self.element = element self.is_selected = is_selected def __call__(self, ignored): return self.element.is_selected() == self.is_selected
这里需要传入一个预期值,首先要明白,代码所需要的预期值是什么,是bool类型,也就是True或者False。所以我们传值的时候要带上要判断的预期值。
def element_selection_state(self,selected,*ele): """判断元素状态符合预期""" self.wait.until(EC.element_selection_state_to_be(self.fox.find_element(*ele),selected), message="与预期值不匹配,请检查预期值") if __name__ == '__main__': b = Brouser() b.get_url('http://shop.aircheng.com/simple/login') b.fox.find_element(By.NAME,'remember').click() b.element_selection_state(True,By.NAME,'remember')
element_located_selection_state_to_be
class element_located_selection_state_to_be(object): def __init__(self, locator, is_selected): self.locator = locator self.is_selected = is_selected def __call__(self, driver): try: element = _find_element(driver, self.locator) return element.is_selected() == self.is_selected except StaleElementReferenceException: return False
这个也是类似的,源码中带了元素对象_find_element,所以只需要传定位元素、预期值以及方法即可。
number_of_windows_to_be
❝这是个离谱的方法,因为,这个判断打开浏览器窗口的值是否先等的。那么为什么离谱呢,博主自测火狐浏览器,每次打开的窗口值都不同,所以这个窗口的方法,使用范围及其有限。在这里知道有这个方法即可。因为咱也不知道下一次打开的窗口号是多少。「有懂其他方法的可以私聊我,让我学习一下」
❞
new_window_is_opened
如果说上面的那个方法是鸡肋,那么这个还有点用处。一起看看
class new_window_is_opened(object): def __init__(self, current_handles): self.current_handles = current_handles def __call__(self, driver): return len(driver.window_handles) > len(self.current_handles)
简单点,就是打开多个网页窗口后,可以使用这个方法进行判断,如果获取的全部窗口长度>传入的窗口长度,则为True反之为False那么问题来了,如何知道传入的窗口长度,自己传入一个int的整数吗还是获取当前窗口。这就看项目来了,下面的例子是获取当前的窗口数传递的。
def new_window(self,num): self.wait.until(EC.new_window_is_opened(num),message='窗口数错了') if __name__ == '__main__': b = Brouser() b.get_url('http://shop.aircheng.com/simple/login') js = "window.open('https://www.baidu.com/')" b.fox.execute_script(js) headers = b.fox.current_window_handle b.new_window([headers])
alert_is_present
最后介绍一下这个方法,检测alert弹窗的。
class alert_is_present(object): def __init__(self): pass def __call__(self, driver): try: alert = driver.switch_to.alert return alert except NoAlertPresentException: return False
调用这个方法后会返回检测的结果,当为True也就是返回了变量alert时,我们就可以进行点击确认等操作了。看看测试代码
def alert_present(self): return self.wait.until(EC.alert_is_present(), message='没有alert') if __name__ == '__main__': b = Brouser() from selenium.webdriver.common.action_chains import ActionChains b.fox.get('https://www.baidu.com') # 定位设置按钮 res = b.fox.find_element_by_id('s-usersetting-top') # 鼠标悬停在设置的元素上 ActionChains(b.fox).move_to_element(res).perform() # 点击搜索设置 b.fox.find_element('class name', 'setpref').click() # 更换设置 b.fox.find_element('id', 'nr_2').click() # 点击保存设置 b.fox.find_element('link text', '保存设置').click() # 切换窗口 a = b.alert_present() # 点击确定,确定与取消不能同时存在 a.accept()
此处我是返回了方法的,否则,无法做点击确认等操作。
❝到此,显示等待基本上就已经讲完了,下面会将全部的二次封装源码贴出来,自己可以在原基础上进行改动,成为自己写的代码的基类的一部分。
❞
二次封装WebDriverWait源码
「代码中也有部分文中所讲到的例子」
# -->>>清安<<<--- from time import sleep from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium import webdriver class Brouser: fox = webdriver.Firefox() wait = WebDriverWait(fox, 5) def get_url(self, url): self.fox.get(url) def title(self, value): """网页标题是否正确""" self.wait.until(EC.title_is(value), message='标题不匹配哦') def contains_title(self,value): """判断是否包含指定、特定的文本""" self.wait.until(EC.title_contains(value)) def presence_located(self,value,*ele): """检查DOM上是否存在元素,不一定意味着元素是可见的""" el = self.wait.until(EC.presence_of_element_located(ele),message='没有发现期望的元素') el.send_keys(value) def visibility_located(self,value,*ele): """检查元素是否存在于页面和可见""" el = self.wait.until(EC.visibility_of_all_elements_located(ele), message='没有发现期望的元素') el[0].send_keys(value) def visibility_(self,*ele): """检查已知存在于页面的DOM是可见的""" el = self.wait.until(EC.visibility_of(self.fox.find_element(*ele))) el.click() def url_be(self,url): """检查当前url的期望值。url是预期的url""" self.wait.until(EC.url_to_be(url)) def text_element(self,text,*ele): """对应的文本值是否正确""" self.wait.until(EC.text_to_be_present_in_element(ele, text),message='请检查定位的文本值') def text_element_value(self,text,*ele): """对应的属性值是否正确""" self.wait.until(EC.text_to_be_present_in_element_value(ele, text),message='请检查对应的value属性值哦') def frame_switch_to(self,*ele): """需要跑frame框架,就使用https://login.tmall.com/地址""" self.wait.until(EC.frame_to_be_available_and_switch_to_it(ele),message='请检查元素') def invisibility_element(self,*ele): """元素时候不可见或异常""" self.wait.until(EC.invisibility_of_element_located(ele), message='请检查元素是否正确') def element_clickable(self,*ele): """元素是否可以点击""" ele = self.wait.until(EC.element_to_be_clickable(ele),message='请检查元素是否可点击') ele.click() def staleness_(self,*ele): """判断元素是否从DOM中移除""" self.wait.until_not(EC.staleness_of(self.fox.find_element(ele))) def element_selected(self,*ele): """判断某个元素是否被选中""" self.wait.until(EC.element_to_be_selected(self.fox.find_element(*ele)),message="元素没有被选中,请检查元素") def element_located_selected(self,*ele): """判断某个元素是否被选中""" self.wait.until(EC.element_located_to_be_selected(ele), message="元素没有被选中,请检查元素") def element_selection_state(self,selected,*ele): """判断元素状态符合预期""" self.wait.until(EC.element_selection_state_to_be(self.fox.find_element(*ele),selected), message="与预期值不匹配,请检查预期值") def new_window(self,num): """窗口长度判断""" self.wait.until(EC.new_window_is_opened(num),message='窗口数错了') def alert_present(self): return self.wait.until(EC.alert_is_present(), message='没有alert') if __name__ == '__main__': b = Brouser() # b.get_url('http://shop.aircheng.com/simple/login') # js = "window.open('https://www.baidu.com/')" # b.fox.execute_script(js) """ b.get_url('https://baidu.com') b.fox.find_element(By.ID,'s-usersetting-top').click() b.fox.find_element(By.CLASS_NAME,'set').click() b.fox.find_element(By.ID,'s1_1').click() b.element_selected(By.ID, "s1_1") b.element_located_selected(By.ID,"s1_1")""" # b.get_url('https://login.tmall.com/') # b.url_be('http://shop.aircheng.com/simple/login') # b.presence_located('qingan', By.NAME, 'login_info') # b.visibility_located('qingan',By.NAME,'password') # b.visibility_(By.NAME, 'remember') # b.text_element('新用户',By.CLASS_NAME, 'reg_btn') # b.text_element_value('登录',By.CLASS_NAME,'input_submit') """ # b.frame_switch_to(By.ID,'J_loginIframe') # t = b.fox.find_element(By.CLASS_NAME,'forgot-password-a-link').text # print(t)""" # b.invisibility_element(By.CLASS_NAME,'ddd') # b.element_clickable(By.NAME, 'remember') # b.staleness_(By.NAME,'remember') # b.fox.find_element(By.NAME,'remember').click() # b.element_selection_state(True,By.NAME,'remember') # headers = b.fox.current_window_handle # b.new_window([headers]) from selenium.webdriver.common.action_chains import ActionChains b.fox.get('https://www.baidu.com') # 定位设置按钮 res = b.fox.find_element_by_id('s-usersetting-top') # 鼠标悬停在设置的元素上 ActionChains(b.fox).move_to_element(res).perform() # 点击搜索设置 b.fox.find_element('class name', 'setpref').click() # 更换设置 b.fox.find_element('id', 'nr_2').click() # 点击保存设置 b.fox.find_element('link text', '保存设置').click() # 切换窗口 a = b.alert_present() # 点击确定,确定与取消不能同时存在 a.accept()