1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 # @Time : 2019/10/14 23:37 4 # @Author : Tang Yiwei 5 # @Email : 892398433@qq.com 6 # @File : WaitUtil.py 7 # @Software: PyCharm 8 9 from selenium.webdriver.support import expected_conditions as EC 10 from util.ObjectMap import * 11 from selenium.common.exceptions import NoSuchElementException,TimeoutException 12 13 class WaitUtil(): 14 15 def __init__(self,driver): 16 self.driver = driver 17 self.wait = WebDriverWait(self.driver,30) 18 19 def presence_of_element_located(self,selector): 20 """显示的等待页面元素出现在DOM中,但不一定可见,存在则返回该元素的页面对象,定位器传入元祖类型""" 21 try: 22 if '=>' not in selector: 23 element = self.wait.until(EC.presence_of_element_located(findElement(self.driver, selector))) 24 return element 25 else: 26 locationType = selector.split('=>')[0] 27 locatorExpression = selector.split('=>')[1] 28 if locationType.lower() in ['i', 'id']: 29 element = self.wait.until(EC.presence_of_element_located((By.ID, locatorExpression))) 30 elif locationType.lower() in ['n', 'name']: 31 element = self.wait.until(EC.presence_of_element_located((By.NAME, locatorExpression))) 32 elif locationType.lower() in ['c', 'class']: 33 element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, locatorExpression))) 34 elif locationType.lower() in ['l', 'link']: 35 element = self.wait.until(EC.presence_of_element_located((By.LINK_TEXT, locatorExpression))) 36 elif locationType.lower() in ['p', 'partial_link']: 37 element = self.wait.until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, locatorExpression))) 38 elif locationType.lower() in ['t', 'tag_name']: 39 element = self.wait.until(EC.presence_of_element_located((By.TAG_NAME, locatorExpression))) 40 elif locationType.lower() in ['x', 'xpath']: 41 element = self.wait.until(EC.presence_of_element_located((By.XPATH, locatorExpression))) 42 elif locationType.lower() in ['s', 'css']: 43 element = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, locatorExpression))) 44 return element 45 except TimeoutException as e: 46 print(traceback.print_exc()) 47 except NoSuchElementException as e: 48 print(traceback.print_exc()) 49 except Exception as e: 50 raise e 51 52 def frame_to_be_available_and_switch_to_it(self,selector): 53 """检查Frame是否存在,存在则切换进frame控件中,定位器传入元祖类型""" 54 try: 55 if '=>' not in selector: 56 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,selector))) 57 else: 58 locationType = selector.split('=>')[0] 59 locatorExpression = selector.split('=>')[1] 60 if locationType.lower() in ['i', 'id']: 61 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, locatorExpression))) 62 elif locationType.lower() in ['n', 'name']: 63 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, locatorExpression))) 64 elif locationType.lower() in ['c', 'class']: 65 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, locatorExpression))) 66 elif locationType.lower() in ['l', 'link']: 67 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.LINK_TEXT, locatorExpression))) 68 elif locationType.lower() in ['p', 'partial_link']: 69 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.PARTIAL_LINK_TEXT, locatorExpression))) 70 elif locationType.lower() in ['t', 'tag_name']: 71 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, locatorExpression))) 72 elif locationType.lower() in ['x', 'xpath']: 73 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, locatorExpression))) 74 elif locationType.lower() in ['s', 'css']: 75 self.wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, locatorExpression))) 76 except TimeoutException as e: 77 print(traceback.print_exc()) 78 except NoSuchElementException as e: 79 print(traceback.print_exc()) 80 except Exception as e: 81 raise e 82 83 def visibility_of_element_located(self,selector): 84 """显示等待页面元素的出现在DOM中,并且可见,存在则返回该页面元素对象,定位器传入元祖类型""" 85 try: 86 if '=>' not in selector: 87 element = self.wait.until(EC.visibility_of_element_located((By.ID,selector))) 88 return element 89 else: 90 locationType = selector.split('=>')[0] 91 locatorExpression = selector.split('=>')[1] 92 if locationType.lower() in ['i', 'id']: 93 element = self.wait.until(EC.visibility_of_element_located((By.ID, locatorExpression))) 94 elif locationType.lower() in ['n', 'name']: 95 element = self.wait.until(EC.visibility_of_element_located((By.NAME, locatorExpression))) 96 elif locationType.lower() in ['c', 'class']: 97 element = self.wait.until(EC.visibility_of_element_located((By.CLASS_NAME, locatorExpression))) 98 elif locationType.lower() in ['l', 'link']: 99 element = self.wait.until(EC.visibility_of_element_located((By.LINK_TEXT, locatorExpression))) 100 elif locationType.lower() in ['p', 'partial_link']: 101 element = self.wait.until(EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, locatorExpression))) 102 elif locationType.lower() in ['t', 'tag_name']: 103 element = self.wait.until(EC.visibility_of_element_located((By.TAG_NAME, locatorExpression))) 104 elif locationType.lower() in ['x', 'xpath']: 105 element = self.wait.until(EC.visibility_of_element_located((By.XPATH, locatorExpression))) 106 elif locationType.lower() in ['s', 'css']: 107 element = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, locatorExpression))) 108 return element 109 except TimeoutException as e: 110 print(traceback.print_exc()) 111 except NoSuchElementException as e: 112 print(traceback.print_exc()) 113 except Exception as e: 114 raise e 115 116 def alert_is_present(self): 117 """判断弹框是否弹出""" 118 try: 119 alertText = self.wait.until(EC.alert_is_present()).text 120 return alertText 121 except Exception as e: 122 raise e 123 124 def element_located_selection_state_to_be(self, selector, state): 125 """ 126 判断一个元素的状态是否是给定的选择状态,第一个传入的参数是一个定位器,定位器是一个元组(by,xpath); 127 第二个元素表示状态,True表示选中状态,False表示未选中状态;相等返回True,不相等返回False; 128 """ 129 try: 130 if '=>' not in selector: 131 element = self.wait.until(EC.element_located_selection_state_to_be((By.ID,selector),state)) 132 return element 133 else: 134 locationType = selector.split('=>')[0] 135 locatorExpression = selector.split('=>')[1] 136 if locationType.lower() in ['i', 'id']: 137 element = self.wait.until(EC.element_located_selection_state_to_be((By.ID, locatorExpression),state)) 138 elif locationType.lower() in ['n', 'name']: 139 element = self.wait.until(EC.element_located_selection_state_to_be((By.NAME, locatorExpression),state)) 140 elif locationType.lower() in ['c', 'class']: 141 element = self.wait.until(EC.element_located_selection_state_to_be((By.CLASS_NAME, locatorExpression),state)) 142 elif locationType.lower() in ['l', 'link']: 143 element = self.wait.until(EC.element_located_selection_state_to_be((By.LINK_TEXT, locatorExpression),state)) 144 elif locationType.lower() in ['p', 'partial_link']: 145 element = self.wait.until(EC.element_located_selection_state_to_be((By.PARTIAL_LINK_TEXT, locatorExpression),state)) 146 elif locationType.lower() in ['t', 'tag_name']: 147 element = self.wait.until(EC.element_located_selection_state_to_be((By.TAG_NAME, locatorExpression),state)) 148 elif locationType.lower() in ['x', 'xpath']: 149 element = self.wait.until(EC.element_located_selection_state_to_be((By.XPATH, locatorExpression),state)) 150 elif locationType.lower() in ['s', 'css']: 151 element = self.wait.until(EC.element_located_selection_state_to_be((By.CSS_SELECTOR, locatorExpression),state)) 152 return element 153 except TimeoutException as e: 154 print(traceback.print_exc()) 155 except NoSuchElementException as e: 156 print(traceback.print_exc()) 157 except Exception as e: 158 raise e 159 160 def element_selection_state_to_be(self,selector,state): 161 """ 162 判断给定的元素是否被选中,第一个参数是WebDriver对象; 163 第二个参数是期望的元素状态,相等返回True,否则返回False; 164 """ 165 try: 166 self.wait.until(EC.element_selection_state_to_be(findElement(self.driver,selector),state)) 167 except TimeoutException as e: 168 print(traceback.print_exc()) 169 except NoSuchElementException as e: 170 print(traceback.print_exc()) 171 except Exception as e: 172 raise e 173 174 def element_to_be_selected(self,selector): 175 """ 176 期望元素处于选中状态,参数为一个WebDriver实例对象 177 """ 178 try: 179 element = self.wait.until(EC.element_to_be_selected(findElement(self.driver,selector))) 180 return element 181 except TimeoutException as e: 182 print(traceback.print_exc()) 183 except NoSuchElementException as e: 184 print(traceback.print_exc()) 185 except Exception as e: 186 raise e 187 188 def element_to_be_clickable(self,selector): 189 """ 190 判断元素是否可见并且能被点击,条件满足,返回该元素的页面对象,否则返回False,传入元祖类型定位器 191 """ 192 try: 193 if '=>' not in selector: 194 element = self.wait.until(EC.element_to_be_clickable((By.ID, selector))) 195 return element 196 else: 197 locationType = selector.split('=>')[0] 198 locatorExpression = selector.split('=>')[1] 199 if locationType.lower() in ['i', 'id']: 200 element = self.wait.until(EC.element_to_be_clickable((By.ID, locatorExpression))) 201 elif locationType.lower() in ['n', 'name']: 202 element = self.wait.until(EC.element_to_be_clickable((By.NAME, locatorExpression))) 203 elif locationType.lower() in ['c', 'class']: 204 element = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, locatorExpression))) 205 elif locationType.lower() in ['l', 'link']: 206 element = self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT, locatorExpression))) 207 elif locationType.lower() in ['p', 'partial_link']: 208 element = self.wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, locatorExpression))) 209 elif locationType.lower() in ['t', 'tag_name']: 210 element = self.wait.until(EC.element_to_be_clickable((By.TAG_NAME, locatorExpression))) 211 elif locationType.lower() in ['x', 'xpath']: 212 element = self.wait.until(EC.element_to_be_clickable((By.XPATH, locatorExpression))) 213 elif locationType.lower() in ['s', 'css']: 214 element = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, locatorExpression))) 215 return element 216 except TimeoutException as e: 217 print(traceback.print_exc()) 218 except NoSuchElementException as e: 219 print(traceback.print_exc()) 220 except Exception as e: 221 raise e 222 223 def invisibility_of_element_located(self,selector): 224 """ 225 希望某个元素不可见或者不存在于DOM中,满足条件返回True,否则返回定位到的元素对象,定位器传入元祖类型 226 """ 227 try: 228 if '=>' not in selector: 229 element = self.wait.until(EC.invisibility_of_element_located((By.ID, selector))) 230 return element 231 else: 232 locationType = selector.split('=>')[0] 233 locatorExpression = selector.split('=>')[1] 234 if locationType.lower() in ['i', 'id']: 235 element = self.wait.until(EC.invisibility_of_element_located((By.ID, locatorExpression))) 236 elif locationType.lower() in ['n', 'name']: 237 element = self.wait.until(EC.invisibility_of_element_located((By.NAME, locatorExpression))) 238 elif locationType.lower() in ['c', 'class']: 239 element = self.wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, locatorExpression))) 240 elif locationType.lower() in ['l', 'link']: 241 element = self.wait.until(EC.invisibility_of_element_located((By.LINK_TEXT, locatorExpression))) 242 elif locationType.lower() in ['p', 'partial_link']: 243 element = self.wait.until(EC.invisibility_of_element_located((By.PARTIAL_LINK_TEXT, locatorExpression))) 244 elif locationType.lower() in ['t', 'tag_name']: 245 element = self.wait.until(EC.invisibility_of_element_located((By.TAG_NAME, locatorExpression))) 246 elif locationType.lower() in ['x', 'xpath']: 247 element = self.wait.until(EC.invisibility_of_element_located((By.XPATH, locatorExpression))) 248 elif locationType.lower() in ['s', 'css']: 249 element = self.wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, locatorExpression))) 250 return element 251 except TimeoutException as e: 252 print(traceback.print_exc()) 253 except NoSuchElementException as e: 254 print(traceback.print_exc()) 255 except Exception as e: 256 raise e 257 258 def visibility_of(self,selector): 259 """ 260 希望某个元素出现在页面的DOM中,并且可见,如果满足条件返回该元素的页面元素对象,传入WebElement对象 261 """ 262 try: 263 element = self.wait.until(EC.visibility_of((findElement(self.driver,selector)))) 264 return element 265 except TimeoutException as e: 266 print(traceback.print_exc()) 267 except NoSuchElementException as e: 268 print(traceback.print_exc()) 269 except Exception as e: 270 raise e 271 272 def visibility_of_any_elements_located(self,selector): 273 """ 274 判断页面上至少有一个元素可见,返回满足条件的所有页面元素对象,传入元祖类型的定位器 275 """ 276 try: 277 if '=>' not in selector: 278 element = self.wait.until(EC.visibility_of_any_elements_located((By.ID, selector))) 279 return element 280 else: 281 locationType = selector.split('=>')[0] 282 locatorExpression = selector.split('=>')[1] 283 if locationType.lower() in ['i', 'id']: 284 element = self.wait.until(EC.visibility_of_any_elements_located((By.ID, locatorExpression))) 285 elif locationType.lower() in ['n', 'name']: 286 element = self.wait.until(EC.visibility_of_any_elements_located((By.NAME, locatorExpression))) 287 elif locationType.lower() in ['c', 'class']: 288 element = self.wait.until(EC.visibility_of_any_elements_located((By.CLASS_NAME, locatorExpression))) 289 elif locationType.lower() in ['l', 'link']: 290 element = self.wait.until(EC.visibility_of_any_elements_located((By.LINK_TEXT, locatorExpression))) 291 elif locationType.lower() in ['p', 'partial_link']: 292 element = self.wait.until(EC.visibility_of_any_elements_located((By.PARTIAL_LINK_TEXT, locatorExpression))) 293 elif locationType.lower() in ['t', 'tag_name']: 294 element = self.wait.until(EC.visibility_of_any_elements_located((By.TAG_NAME, locatorExpression))) 295 elif locationType.lower() in ['x', 'xpath']: 296 element = self.wait.until(EC.visibility_of_any_elements_located((By.XPATH, locatorExpression))) 297 elif locationType.lower() in ['s', 'css']: 298 element = self.wait.until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR, locatorExpression))) 299 return element 300 except TimeoutException as e: 301 print(traceback.print_exc()) 302 except NoSuchElementException as e: 303 print(traceback.print_exc()) 304 except Exception as e: 305 raise e 306 307 def presence_of_all_elements_located(self,selector): 308 """ 309 判断页面上至少有一个元素出现,如果满足条件返回所有满足定位表达式的页面元素,传入元祖类型定位器 310 """ 311 try: 312 if '=>' not in selector: 313 element = self.wait.until(EC.presence_of_all_elements_located((By.ID, selector))) 314 return element 315 else: 316 locationType = selector.split('=>')[0] 317 locatorExpression = selector.split('=>')[1] 318 if locationType.lower() in ['i', 'id']: 319 element = self.wait.until(EC.presence_of_all_elements_located((By.ID, locatorExpression))) 320 elif locationType.lower() in ['n', 'name']: 321 element = self.wait.until(EC.presence_of_all_elements_located((By.NAME, locatorExpression))) 322 elif locationType.lower() in ['c', 'class']: 323 element = self.wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, locatorExpression))) 324 elif locationType.lower() in ['l', 'link']: 325 element = self.wait.until(EC.presence_of_all_elements_located((By.LINK_TEXT, locatorExpression))) 326 elif locationType.lower() in ['p', 'partial_link']: 327 element = self.wait.until(EC.presence_of_all_elements_located((By.PARTIAL_LINK_TEXT, locatorExpression))) 328 elif locationType.lower() in ['t', 'tag_name']: 329 element = self.wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, locatorExpression))) 330 elif locationType.lower() in ['x', 'xpath']: 331 element = self.wait.until(EC.presence_of_all_elements_located((By.XPATH, locatorExpression))) 332 elif locationType.lower() in ['s', 'css']: 333 element = self.wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, locatorExpression))) 334 return element 335 except TimeoutException as e: 336 print(traceback.print_exc()) 337 except NoSuchElementException as e: 338 print(traceback.print_exc()) 339 except Exception as e: 340 raise e 341 342 def staleness_of(self,selector): 343 """ 344 判断一个元素是否仍在DOM中,如果在规定的时间内已经移出,返回True,否则返回False,传入WebElement对象 345 """ 346 try: 347 element = self.wait.until(EC.staleness_of((findElement(self.driver,selector)))) 348 return element 349 except TimeoutException as e: 350 print(traceback.print_exc()) 351 except NoSuchElementException as e: 352 print(traceback.print_exc()) 353 except Exception as e: 354 raise e 355 356 def text_to_be_present_in_element(self,selector,text): 357 """ 358 判断文本内容text是否出现在某个元素中,判断的是元素的text,定位器是一个元祖 359 """ 360 try: 361 if '=>' not in selector: 362 element = self.wait.until(EC.text_to_be_present_in_element((By.ID, selector),text)) 363 return element 364 else: 365 locationType = selector.split('=>')[0] 366 locatorExpression = selector.split('=>')[1] 367 if locationType.lower() in ['i', 'id']: 368 element = self.wait.until(EC.text_to_be_present_in_element((By.ID, locatorExpression),text)) 369 elif locationType.lower() in ['n', 'name']: 370 element = self.wait.until(EC.text_to_be_present_in_element((By.NAME, locatorExpression),text)) 371 elif locationType.lower() in ['c', 'class']: 372 element = self.wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, locatorExpression),text)) 373 elif locationType.lower() in ['l', 'link']: 374 element = self.wait.until(EC.text_to_be_present_in_element((By.LINK_TEXT, locatorExpression),text)) 375 elif locationType.lower() in ['p', 'partial_link']: 376 element = self.wait.until(EC.text_to_be_present_in_element((By.PARTIAL_LINK_TEXT, locatorExpression),text)) 377 elif locationType.lower() in ['t', 'tag_name']: 378 element = self.wait.until(EC.text_to_be_present_in_element((By.TAG_NAME, locatorExpression),text)) 379 elif locationType.lower() in ['x', 'xpath']: 380 element = self.wait.until(EC.text_to_be_present_in_element((By.XPATH, locatorExpression),text)) 381 elif locationType.lower() in ['s', 'css']: 382 element = self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, locatorExpression),text)) 383 return element 384 except TimeoutException as e: 385 print(traceback.print_exc()) 386 except NoSuchElementException as e: 387 print(traceback.print_exc()) 388 except Exception as e: 389 raise e 390 391 def text_to_be_present_in_element_value(self,selector,text): 392 """ 393 判断text是否出现在元素的value属性值中,定位器是一个元祖 394 """ 395 try: 396 if '=>' not in selector: 397 element = self.wait.until(EC.text_to_be_present_in_element_value((By.ID, selector),text)) 398 return element 399 else: 400 locationType = selector.split('=>')[0] 401 locatorExpression = selector.split('=>')[1] 402 if locationType.lower() in ['i', 'id']: 403 element = self.wait.until(EC.text_to_be_present_in_element_value((By.ID, locatorExpression),text)) 404 elif locationType.lower() in ['n', 'name']: 405 element = self.wait.until(EC.text_to_be_present_in_element_value((By.NAME, locatorExpression),text)) 406 elif locationType.lower() in ['c', 'class']: 407 element = self.wait.until(EC.text_to_be_present_in_element_value((By.CLASS_NAME, locatorExpression),text)) 408 elif locationType.lower() in ['l', 'link']: 409 element = self.wait.until(EC.text_to_be_present_in_element_value((By.LINK_TEXT, locatorExpression),text)) 410 elif locationType.lower() in ['p', 'partial_link']: 411 element = self.wait.until(EC.text_to_be_present_in_element_value((By.PARTIAL_LINK_TEXT, locatorExpression),text)) 412 elif locationType.lower() in ['t', 'tag_name']: 413 element = self.wait.until(EC.text_to_be_present_in_element_value((By.TAG_NAME, locatorExpression),text)) 414 elif locationType.lower() in ['x', 'xpath']: 415 element = self.wait.until(EC.text_to_be_present_in_element_value((By.XPATH, locatorExpression),text)) 416 elif locationType.lower() in ['s', 'css']: 417 element = self.wait.until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR, locatorExpression),text)) 418 return element 419 except TimeoutException as e: 420 print(traceback.print_exc()) 421 except NoSuchElementException as e: 422 print(traceback.print_exc()) 423 except Exception as e: 424 raise e 425 426 def new_window_is_opened(self,handles): 427 """ 428 判断窗口是否打开 429 :param handles:窗口句柄, 可传self.driver.window_handles,用于click后打开新窗口后的判断 430 :return:True or False 431 """ 432 return self.wait.until(EC.new_window_is_opened(handles)) 433 434 435 def title_contains(self,partial_title): 436 """ 437 判断页面title标签内容是否包含partial_title,只需要部分匹配即可,包含返回True,否则返回False 438 """ 439 try: 440 return self.wait.until(EC.title_contains(partial_title)) 441 except TimeoutException as e: 442 print(traceback.print_exc()) 443 except NoSuchElementException as e: 444 print(traceback.print_exc()) 445 except Exception as e: 446 raise e 447 448 def title_is(self,title_text): 449 """ 450 判断页面title内容是否和传入的title_text内容完全匹配,匹配返回True,否则返回False 451 """ 452 try: 453 return self.wait.until(EC.title_is(title_text)) 454 except: 455 return False 456 457 458 459 460 if __name__ == "__main__": 461 pass