UI常见的元素定位方式
1 ## 元素定位方式 2 3 ### Xpath 定位 4 5 #### 通过ID定位 6 7 ##### 第一种 使用find_element_by_xpath 8 9 ```python 10 from selenium import webdriver 11 import time 12 from selenium.webdriver.support.wait import WebDriverWait 13 from selenium.common.exceptions import NoSuchElementException 14 15 16 driver = webdriver.Chrome() 17 driver.maximize_window() 18 driver.implicitly_wait(5) 19 20 driver.get('http://www.baidu.com') 21 try: 22 driver.find_element_by_xpath("//*[@id='kw']").send_keys('xpath常用八种定位方法') 23 24 except NoSuchElementException as err: 25 print(err) 26 27 finally: 28 pass 29 30 time.sleep(3) 31 32 driver.quit() 33 34 ``` 35 36 ##### 第二种使用 webdriver.common.by 模块 37 38 ```python 39 from selenium import webdriver 40 import time 41 from selenium.webdriver.support.wait import WebDriverWait 42 from selenium.common.exceptions import NoSuchElementException 43 from selenium.webdriver.common.by import By as by 44 45 46 driver = webdriver.Chrome() 47 driver.maximize_window() 48 driver.implicitly_wait(5) 49 50 driver.get('http://www.baidu.com') 51 try: 52 driver.find_element(by.XPATH,"//*[@id='kw']").send_keys('你为什么这么好看') 53 54 except NoSuchElementException as err: 55 print(err) 56 57 finally: 58 pass 59 60 time.sleep(3) 61 62 driver.quit() 63 ``` 64 65 #### 通过name定位 66 67 ##### 第一种 使用find_element_by_xpath 68 69 ```python 70 from selenium import webdriver 71 import time 72 from selenium.webdriver.support.wait import WebDriverWait 73 from selenium.common.exceptions import NoSuchElementException 74 75 76 driver = webdriver.Chrome() 77 driver.maximize_window() 78 driver.implicitly_wait(5) 79 80 driver.get('http://www.baidu.com') 81 try: 82 driver.find_element_by_xpath("//*[@name='wd']").send_keys('哈哈哈哈哈') 83 84 except NoSuchElementException as err: 85 print(err) 86 87 finally: 88 pass 89 90 time.sleep(3) 91 92 driver.quit() 93 94 ``` 95 96 ##### 第二种使用 webdriver.common.by 模块 97 98 ```python 99 from selenium import webdriver 100 import time 101 from selenium.webdriver.support.wait import WebDriverWait 102 from selenium.common.exceptions import NoSuchElementException 103 from selenium.webdriver.common.by import By as by 104 105 106 driver = webdriver.Chrome() 107 driver.maximize_window() 108 driver.implicitly_wait(5) 109 110 driver.get('http://www.baidu.com') 111 try: 112 driver.find_element(by.XPATH,"//*[@name='wd']").send_keys('你为什么这么好看') 113 114 except NoSuchElementException as err: 115 print(err) 116 117 finally: 118 pass 119 120 time.sleep(3) 121 122 driver.quit() 123 ``` 124 125 #### 通过class定位 126 127 ##### 第一种 使用find_element_by_xpath 128 129 ```python 130 from selenium import webdriver 131 import time 132 from selenium.webdriver.support.wait import WebDriverWait 133 from selenium.common.exceptions import NoSuchElementException 134 135 136 driver = webdriver.Chrome() 137 driver.maximize_window() 138 driver.implicitly_wait(5) 139 140 driver.get('http://www.baidu.com') 141 try: 142 driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys('哈哈哈哈哈') 143 144 except NoSuchElementException as err: 145 print(err) 146 147 finally: 148 pass 149 150 time.sleep(3) 151 152 driver.quit() 153 154 ``` 155 156 ##### 第二种使用 webdriver.common.by 模块 157 158 ```python 159 from selenium import webdriver 160 import time 161 from selenium.webdriver.support.wait import WebDriverWait 162 from selenium.common.exceptions import NoSuchElementException 163 from selenium.webdriver.common.by import By as by 164 165 166 driver = webdriver.Chrome() 167 driver.maximize_window() 168 driver.implicitly_wait(5) 169 170 driver.get('http://www.baidu.com') 171 try: 172 driver.find_element(by.XPATH,"//*[@class='s_ipt']").send_keys('你为什么这么好看') 173 174 except NoSuchElementException as err: 175 print(err) 176 177 finally: 178 pass 179 180 time.sleep(3) 181 182 driver.quit() 183 184 185 ``` 186 187 #### n相对路径和绝对路径定位 188 189 先介绍一下 ‘/’ 和‘//’区别 ,‘/’ 表示绝对路径 ‘//’表示相对路径 190 191 比如 : //*[@id="su"] 表示 匹配页面下 所有的 id属性为 su的 元素 192 193 //*[@id="form"]/input[11] 表示匹配 所有 属性ID 为 form 元素 下 lnput 控件 的 11位元素 194 195 ######建议 找个视频看一下 这个文字不好描述 196 197 198 199 相对定位 -- 以// 开头 如://form//input[@name="phone"] 推荐使用相对定位 定位元素 200 201 ```python 202 from selenium import webdriver 203 import time 204 from selenium.webdriver.support.wait import WebDriverWait 205 from selenium.common.exceptions import NoSuchElementException 206 207 208 driver = webdriver.Chrome() 209 driver.maximize_window() 210 driver.implicitly_wait(5) 211 212 driver.get('http://www.baidu.com') 213 try: 214 driver.find_element_by_xpath('//*[@id="s-top-left"]/a[1]').click() 215 except NoSuchElementException as err: 216 print(err) 217 218 finally: 219 pass 220 221 time.sleep(3) 222 223 driver.quit() 224 ``` 225 226 227 228 绝对定位 -- 以/ 开头,但是要从根目录开始,比较繁琐,一般不建议使用 如:/html/body/div/a 229 230 ```python 231 from selenium import webdriver 232 import time 233 from selenium.webdriver.support.wait import WebDriverWait 234 from selenium.common.exceptions import NoSuchElementException 235 236 237 driver = webdriver.Chrome() 238 driver.maximize_window() 239 driver.implicitly_wait(5) 240 241 driver.get('http://www.baidu.com') 242 try: 243 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[3]/a[1]').click() 244 except NoSuchElementException as err: 245 print(err) 246 247 finally: 248 pass 249 250 time.sleep(3) 251 252 driver.quit() 253 254 ``` 255 256 ### CSS定位方式 257 258 1. css是一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器 259 2. css定位就是通过css选择器工具进行定位的 260 3. 极力推荐使用css,css查找效率高,语法简单 261 262 ``` 263 driver.find_element_by_css_selector() 264 ``` 265 266 ##### id[选择器] 267 268 前提:元素必须有id属性 269 270 语法:#id 如:id='kw' 写入代码 就是 #kw 271 272 ```python 273 from selenium import webdriver 274 import time 275 from selenium.webdriver.support.wait import WebDriverWait 276 from selenium.common.exceptions import NoSuchElementException 277 278 279 driver = webdriver.Chrome() 280 driver.maximize_window() 281 driver.implicitly_wait(5) 282 283 driver.get('http://www.baidu.com') 284 try: 285 driver.find_element_by_css_selector("#kw").send_keys('css的id选择器') 286 287 except NoSuchElementException as err: 288 print(err) 289 290 finally: 291 pass 292 293 time.sleep(3) 294 295 driver.quit() 296 ``` 297 298 ##### 属性选择器 299 300 语法:[属性名='属性值'] 301 302 ```python 303 from selenium import webdriver 304 import time 305 from selenium.webdriver.support.wait import WebDriverWait 306 from selenium.common.exceptions import NoSuchElementException 307 308 309 driver = webdriver.Chrome() 310 driver.maximize_window() 311 driver.implicitly_wait(5) 312 313 driver.get('http://www.baidu.com') 314 try: 315 driver.find_element_by_css_selector("[id='kw']").send_keys('css的id选择器') 316 317 except NoSuchElementException as err: 318 print(err) 319 320 finally: 321 pass 322 323 time.sleep(3) 324 325 driver.quit() 326 ``` 327 328 ##### class[选择器] 329 330 前提:元素是必须有class属性 331 332 语法:.class 如:class = 's_ipt' 写入代码为 .s_ipt 333 334 ```python 335 from selenium import webdriver 336 import time 337 from selenium.webdriver.support.wait import WebDriverWait 338 from selenium.common.exceptions import NoSuchElementException 339 driver = webdriver.Chrome() 340 driver.maximize_window() 341 driver.implicitly_wait(5) 342 driver.get('http://www.baidu.com') 343 try: 344 driver.find_element_by_css_selector(".s_ipt").send_keys('css的class选择器') 345 346 except NoSuchElementException as err: 347 print(err) 348 349 finally: 350 pass 351 352 time.sleep(3) 353 354 driver.quit() 355 ``` 356 357 ##### 层级选择器 358 359 (1)父级标签>子级标签,如p>input 360 361 (2)上级任意标签 子级标签,如:p input 平时工作 不常用 知道就行 362 363 ```python 364 from selenium import webdriver 365 import time 366 from selenium.webdriver.support.wait import WebDriverWait 367 from selenium.common.exceptions import NoSuchElementException 368 driver = webdriver.Chrome() 369 driver.maximize_window() 370 driver.implicitly_wait(5) 371 driver.get('http://www.baidu.com') 372 try: 373 driver.find_element_by_css_selector('div>form>span>input.s_ipt').send_keys('css的层级选择器') 374 375 except NoSuchElementException as err: 376 print(err) 377 378 finally: 379 pass 380 381 time.sleep(3) 382 383 driver.quit() 384 ``` 385 386 ### 通过tag_name定位 387 388 ** 明:tag_name是通过标签名称来定位的** 比如<a></a> ,<p></p> 等标签 这种定位方式由于标签在一个页面众多 所以经常定位不准确 不推荐在工作中使用这种定位方式 定位 389 390 **注意:如果页面中存在多个相同的标签,默认返回第一个标签元素。** 391 392 ``` 393 driver.find_element_by_tag_name("标签名") 394 ``` 395 396 ```python 397 from selenium import webdriver 398 from time import sleep 399 400 # 这里使用优设导航的百度搜索界面 401 402 # 获取浏览器对象 403 driver = webdriver.Chrome() 404 driver.maximize_window() 405 driver.implicitly_wait(5) 406 # 获取网络链接 407 url = "https://hao.uisdc.com/" 408 driver.get(url) 409 # 获取搜索输入框,输入:优设导航的百度搜索 410 driver.find_element_by_tag_name("input").send_keys("优设导航的百度搜索") 411 # 暂停3秒 412 sleep(3) 413 # 退出浏览器驱动 414 driver.quit() 415 ``` 416 417 418 419 ### 通过link_text 定位 420 421 **注意:link_text:只能使用精准的匹配(a标签的全部文本内容)** 422 423 ```python 424 driver=find_element_by_link_text("文本") 425 ``` 426 427 ```python 428 from selenium import webdriver 429 from time import sleep 430 431 # 这里使用hao123网站界面 432 433 # 获取浏览器对象 434 driver = webdriver.Chrome() 435 driver.maximize_window() 436 driver.implicitly_wait(5) 437 # 获取网络链接 438 url = "https://www.hao123.com/" 439 driver.get(url) 440 # 获取hao123网站的12306超链接位置,并点击超链接 441 driver.find_element_by_link_text("12306").click() 442 443 # 暂停6秒 444 sleep(6) 445 # 退出浏览器驱动 446 driver.quit() 447 ``` 448 449 450 451 ### 通过partial_link_text定位 452 453 **1、说明:定位超链接标签** 454 455 ```python 456 driver.find_element_by_partial_link_text("哔哩").click() 457 ``` 458 459 *注意:可以使用精准或模糊匹配,如果使用模糊匹配最好能使用可以唯一关键字;** 460 461 **如果有多个值,默认返回第一个值。** 462 463 ```python 464 from selenium import webdriver 465 from time import sleep 466 from selenium.common.exceptions import NoSuchElementException 467 # 这里使用hao123网站界面 468 469 # 获取浏览器对象 470 driver = webdriver.Chrome() 471 driver.maximize_window() 472 driver.implicitly_wait(5) 473 # 获取网络链接 474 url = "https://www.hao123.com/" 475 driver.get(url) 476 # 获取hao123网站的12306超链接位置,并点击超链接 477 # driver.find_element_by_link_text("12306").click() 478 try: 479 driver.find_element_by_partial_link_text("哔哩").click() 480 except NoSuchElementException as err: 481 print(err) 482 finally: 483 driver.find_element_by_partial_link_text("中国大学").click() 484 # 暂停6秒 485 sleep(6) 486 # 退出浏览器驱动 487 driver.quit() 488 ``` 489 490 ### id定位 491 492 **说明:通过元素的id属性定位,id一般情况下在当前页面中是唯一的。** 493 494 ``` 495 driver.find_element_by_id(id) 496 ``` 497 498 ```python 499 from selenium import webdriver 500 from time import sleep 501 502 # Pixabay是全球知名的图库网站及充满活力的创意社区,这里使用它的登录界面 503 504 # 获取浏览器对象 505 driver = webdriver.Chrome() 506 driver.maximize_window() 507 driver.implicitly_wait(5) 508 509 # 本地url需要注意:\反斜杠在Python中是转义字符,1、可以在"...\..."之前加字符r,如:r"..\." 510 # 2、也可以将链接中的\再添加一个\,如:"..\\.." 511 # 3、也可以写成"file:///E:....\..." 512 513 # 获取网络链接 514 url = "https://pixabay.com/accounts/login/?source=main_nav&next=/" 515 driver.get(url) 516 # 获取用户名元素和密码元素 517 username = driver.find_element_by_id("id_username") 518 password = driver.find_element_by_id("id_password") 519 # 用户名输入admin,密码输入123241234 520 username.send_keys("admin") 521 password.send_keys("123241234") 522 # 暂停3秒 523 sleep(3) 524 # 退出浏览器驱动 525 driver.quit() 526 ``` 527 528 ### name定位 529 530 **说明:name定位就是根据元素name属性来定位(前提是有name属性)** 531 532 ``` 533 element=driver.find_element_by_name(name) 534 ``` 535 536 ```python 537 from selenium import webdriver 538 from time import sleep 539 540 # 这里使用阿里Iconfont的登录界面 541 542 # 获取浏览器对象 543 driver = webdriver.Chrome() 544 driver.maximize_window() 545 driver.implicitly_wait(5) 546 # 获取网络链接 547 url = "https://login.alibaba-inc.com/ssoLogin.htm?BACK_URL=https%3A%2F%2Fwww.iconfont.cn%2Fapi%2FsendBucSSOToken.do&preLoginKey=HQbkPavlaI1572415135309WAbvcSruKi&CLIENT_VERSION=0.3.7&CONTEXT_PATH=%2Fapi&APP_NAME=icon-font&CANCEL_CERT=true" 548 driver.get(url) 549 # 获取用户名元素和密码元素,用户名输入admin,密码输入123241234 550 driver.find_element_by_name("account").send_keys("admin") 551 driver.find_element_by_name("password").send_keys("123241234") 552 # 暂停3秒 553 sleep(3) 554 # 退出浏览器驱动 555 driver.quit() 556 ``` 557 558 ### class_name定位 559 560 **说明:class_name定位就是根据元素class属性值来定位元素。HTML通过使用class来定义元素的样式。** 561 562 **前提:元素有class属性。** 563 564 **注意:如果class有多个属性值,只能使用其中的一个。** 565 566 ``` 567 element=driver.find_element_by_class_name(class_name) 568 ``` 569 570 ```python 571 from selenium import webdriver 572 from time import sleep 573 574 # 这里使用几案网的登录界面 575 576 # 获取浏览器对象 577 driver = webdriver.Chrome() 578 driver.maximize_window() 579 driver.implicitly_wait(5) 580 # 获取网络链接 581 url = "http://www.ji-an.com/user/index/login" 582 driver.get(url) 583 # 获取手机号码元素和密码元素,用户名输入手机号,密码输入123241234 584 driver.find_element_by_class_name("form-control").send_keys("18255676189") 585 driver.find_element_by_class_name("password").send_keys("123241234") 586 # 暂停3秒 587 sleep(3) 588 # 退出浏览器驱动 589 driver.quit () 590 ``` 591