💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# selenium定位方式 * [Xpath定位](http://brtc.imsam.cn/1377978#Xpath_41) * [CSS定位](http://brtc.imsam.cn/1377978#CSS_93) 在进行web自动化之前,需要先来了解一下web页面的基本内容。 比如,如下是一张百度首页 ![](https://img.kancloud.cn/6f/61/6f61b72faa96d04e90e9b36b1e47c725_1051x445.png) 那如果我们需要对百度页面进行操作,那么我们就需要知道他的html代码了。 我们可以鼠标选中需要操作的元素,`鼠标右键,检查` ![](https://img.kancloud.cn/a1/65/a16560ef0afcb217a26894bacd3fdb19_908x506.png) 这一行代码就是百度输入框的代码了 ![](https://img.kancloud.cn/5e/16/5e164213274dd5f2382d5f60ea463b93_1171x671.png) 来看看这行代码 ~~~ <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> ~~~ 首先第一个,这个是一个html代码,那html代码中 这个代码我们称之为input标签 那在这个input标签中,有很多的属性,其中`=`左边的是属性名称,`=`右边的是属性值 所以这个html标签有id、name、class、value、maxlength等等属性 第二个,HTML标签有自己的层级关系 如图,span标签就是input标签的父标签 ![](https://img.kancloud.cn/e3/d6/e3d6f385065d0a3be464280b742cbd12_1214x325.png) | 定位方式 | 定位表达式 | | --- | --- | | 根据id来定位 | d.find\_element\_by\_id('id的值') | | 根据name来定位 | d.find\_element\_by\_name('name的值') | | 根据class来定位 | d.find\_element\_by\_class\_name('class的值') | | 根据标签名定位 | d.find\_element\_by\_tag\_name('标签名') | | 根据文本链接定位 | d.find\_element\_by\_link\_text('完整的文本链接') | | 根据部分文本链接定位 | d.find\_element\_by\_partial\_link\_text('部分的文本链接') | | 根据css选择器定位 | d.find\_element\_by\_css\_selector('css表达式') | | 根据xpath定位 | d.find\_element\_by\_xpath('xpath表达式') | > ### Xpath定位 * 根据绝对路径定位 ~~~ /html/body/div/form/p/label/input /html/body/div/form/p[2]/label/input ~~~ * 路径与属性的结合 `//标签名[@属性名="属性值"]` 比如说:想定位到 for="user\_pass" 的label标签 `//label[@for="user_pass"]` * 如果想同时使用多个属性去定位 语法: `//标签名[@属性名="属性值" and @属性名="属性值"]` 想定位到:class="input" id="user\_pass" 的 input标签 `//input[@class="input" and @id="user_pass"]` 比如:定位到 for="user\_pass" 的label标签 的 input子标签 `//label[@for="user_pass"]/input` 使用Xpath实现登录blog ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') d.maximize_window() sleep(3) d.find_element_by_xpath('//label[@for="user_login"]/input').send_keys('test') sleep(1) d.find_element_by_xpath('/html/body/div/form/p[2]/label/input').send_keys('test123') sleep(1) d.find_element_by_xpath('//input[@class="button button-primary button-large"]').submit() sleep(1) d.close() d.quit() ~~~ > ### CSS定位 * css中用空格 表示下级标签(可以是子标签,也可是孙子级别标签) * 路径与属性的结合 语法: `标签名[属性名="属性值"]` 比如说:想定位到 for="user\_pass" 的label标签 `label[for="user_pass"]` * 如果想同时使用多个属性去定位 语法: 标签名\[属性名="属性值"\]\[属性名="属性值"\] 想定位到:class="input" id="user\_pass" 的 input标签 `input[class="input"][id="user_pass"]` 比如:定位到 for="user\_pass" 的label标签 的 input子标签 `label[for="user_pass"] input` * 只用属性 想定位到 for="user\_pass" 的标签 `[for="user_pass"]` * 关于id与class定位 在css定位中,id或者class定位有快捷键定位方式 id用#表示,class用.表示 想定位到:id="user\_pass" 的 input标签 `input#user_pass` 想定位到:class="button-primary" 的input标签 `input.button-primary` 想定位到:class="button-primary" id="wp-submit" 的input标签 `input.button-primary#wp-submit` 使用css定位实现blog登录 ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') d.maximize_window() sleep(3) d.find_element_by_css_selector('#user_login').send_keys('test') sleep(3) d.find_element_by_css_selector('input[type="password"]').send_keys('test123') sleep(3) d.find_element_by_css_selector('p.submit input#wp-submit').click() sleep(3) d.close() d.quit() ~~~