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