UI常見的元素定位方式
阿新 • • 發佈:2022-03-08
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 1415 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 27finally: 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 importNoSuchElementException 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