【selenium学习 -3】selenium中的八种基础定位方式
在上节中我说到,我理解的自动化的主要流程是启动-定位-操作-断言,这节主要介绍定位的八种基本方法
在平时写码的过程中,IDE也会有相应的提示
单个元素 | 多个元素 | |
1.根据id定位 |
find_element_by_id() |
|
2.根据name定位 |
find_element_by_name() |
find_elements_by_name() |
3.根据class定位 |
find_element_by_class_name() |
find_elements_by_class_name() |
4.根据tag定位 |
find_element_by_tag_name() |
find_elements_by_tag_name() |
5.根据link text定位 |
find_element_by_link_text() |
find_elements_by_link_text() |
6.根据partial_link定位 |
find_element_by_partial_link_text() |
find_elements_by_partial_link_text() |
7.根据xpath定位 |
find_element_by_xpath() |
find_elements_by_xpath() |
8.根据css选择器定位 |
find_element_by_css_selector() |
find_elements_by_css_selector() |
下面将依次进行举例说明,都以百度为例:
1.根据id进行定位
from selenium import webdriver if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 try: driver.find_element_by_id("kw") print("通过ID找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
通过try except语句来进行了断言,在平时的工程操作中,经常会做一些异常的处理,这个例子,我们通过find_element_by_id()来学习通过id进行定位
2.根据name进行定位
from selenium import webdriver if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 try: driver.find_element_by_name("wd") print("通过name找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
3.根据class进行定位
HTML结构
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: driver.find_element_by_class_name("s_ipt") print("通过class name找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
如果要找多个相同的class的元素,使用 find_elements_by_class_name("xxx")
4.根据tag定位
什么是tag呢
<div class='s-bottom-layer-left'> <p class='1h'>...</p> <p class='1h'>...</p> <p class='1h'>...</p> <p class='1h'>...</p> <p class='1h'>...</p> </div>
其中像<div> <p> 这类就是tag name
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: driver.find_element_by_tag_name('p') print("通过class name找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
但由于此类tag类筛选出来的选项过多,所以实际应用比较少,知道有这一种方法就可以了
5.根据link text定位
像百度首页这些文字,都是link text,我们可以通过文本,比如“新闻”,“地图”等文字,定位到该标签
<div id="s-top-left" class="s-top-left s-isindex-wrap"> <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a> <a href="https://www.hao123.com" target="_blank" class="mnav c-font-normal c-color-t">hao123</a> <a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a> <a href="https://haokan.baidu.com/?sfrom=baidu-top" target="_blank" class="mnav c-font-normal c-color-t">视频</a> <a href="http://tieba.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">贴吧</a> <a href="http://xueshu.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">学术</a> </div>
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: driver.find_element_by_link_text('新闻') print("通过link text找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
6.根据partial_link定位
此种定位方式,和text定位有些类似,有点模糊匹配的感觉,比如,上例中,有一个hao123的文本text,可以用“hao”进行一个类似于模糊匹配
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: driver.find_element_by_partial_link_text('hao').click() print("通过partial link text找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
通过点击 hao123 文本,来观察是否匹配到了元素,一般这种情形下,个人更喜欢用xpath进行定位
7.根据xpath定位
如上例中,点击hao123
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: driver.find_element_by_xpath('//*[@id="s-top-left"]/a[text()="hao123"]').click() time.sleep(2) print("通过xpath找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
xpath定位是我在工作中用的最多的方式,几乎可以达到90%以上,要获取xpath路径,可以通过F12 ->直接右键元素-> copy-> copy Xpath获取,也可以自己写,这里推荐一个chrome插件
Xpath Helper
8.根据css选择器定位
<input type="submit" id="su" value="百度一下" class="bg s_btn">
from selenium import webdriver import time if __name__ == '__main__': driver = webdriver.Chrome() # 1.打开浏览器 driver.maximize_window() # 最大化窗口 driver.get("https://www.baidu.com/") # 2.打开百度 time.sleep(1) try: ele = driver.find_element_by_css_selector("#su").get_attribute("value") print(ele) print("通过css selector找到元素") except Exception as e: print("没有找到元素", format(e)) driver.quit()
这个例子通过css选择器定位“百度一下”这个按钮,并打印文本
总结:说了这么多种定位方式,个人感觉用的最多的还是xpath,毕竟像id,name这些,不是每个元素都一定有,但无论什么情况,用xpath几乎都能搞定