其他分享
首页 > 其他分享> > selenium环境搭建及元素定位大法

selenium环境搭建及元素定位大法

作者:互联网

一、环境搭建:
1.为Python安装selenium模块,pip install selenium
2.下载对应浏览器驱动
http://npm.taobao.org/mirrors/chromedriver/
版本对照表:https://blog.csdn.net/BinGISer/article/details/88559532
Firefoxdriver
https://github.com/mozilla/geckodriver/releases
版本对照表:https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html

二、使用selenium访问百度并搜索

# coding=gbk
from selenium import webdriver
import time
#创建浏览器驱动对象
driver = webdriver.Chrome()
#访问网址
driver.get("https://www.baidu.com")
#找到搜索按钮
input_element = driver.find_element_by_id("kw")
#输入搜索内容
input_element.send_keys("哇哈哈")
#点击搜索按钮
search_element = driver.find_element_by_id("su")
search_element.click()
#等待5秒
time.sleep(5)
#退出浏览器
driver.quit()

反爬虫设置

from selenium import webdriver

options = webdriver.ChromeOptions()
# 设置为开发者模式,防止被各大网站识别出来使用了Selenium
# 屏蔽 windows.navigator.webdriver
options.add_experimental_option('excludeSwitches',['enable-automation'])
# # 不加载图片,加快访问速度
# options.add_experimental_option(
#     "prefs", {"profile.managed_default_content_settings.images": 2})
driver = webdriver.Chrome(executable_path="/Users/nathaniel/MyApp/lib/seleniumLib/chromedriver",options=options)
driver.get("https://www.baidu.com")
driver.quit()

选择界面元素
根据元素的特征:ID,Name,Class,Tag,等
根据元素特征和关系:css,xpath
操作界面元素
输入操作:点击、输入文字、拖拽等
输出操作:获取元素的各种属性
根据界面上获取的数据进行分析和处理

元素定位大法:
**find_element_by_id:**通过ID进行匹配查找,只返回匹配到的一个元素
**find_element_by_name:**通过name进行匹配查找,只返回匹配到的一个元素
**find_element_by_xpath:**通过xpath进行匹配查找,只返回匹配到的一个元素
**find_element_by_link_text:**通过链接内容进行匹配查找,只返回匹配到的一个元素
**find_element_by_partical_link_text:**通过部分链接内容进行匹配查找,只返回匹配到的一个元素
**find_element_by_tag_name:**通过标签名称进行匹配查找,只返回匹配到的一个元素
**find_element_by_class_name:**通过class名称进行匹配查找,只返回匹配到的一个元素
**find_element_by_css_selector:**通过CSS选择器进行匹配查找,只返回匹配到的一个元素

值得注意的是,上面方法只会匹配查找只会获取第一个元素。除了上面这些查找单个元素的方法之外,Selenium还定义查找多个元素的方法:

**find_elements_by_name:**通过name进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_xpath:**通过xpath进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_link_text:**通过链接内容进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_partical_link_text:**通过部分链接内容进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_tag_name:**通过标签名称进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_class_name:**通过class名称进行匹配查找,返回所有匹配到的元素列表
**find_elements_by_css_selector:**通过CSS选择器进行匹配查找,返回所有匹配到的元素列表

from selenium import webdriver
import time
# 创建浏览器驱动
driver = webdriver.Chrome("chromedriver.exe的存放路径")
# 访问网址
driver.get("http://www.baidu.com")
"""
# 元素定位的第一种方式  css_selector,根据 css 选择器定位
# 寻找元素
textElement = driver.find_element_by_css_selector("body > div > p:nth-child(1)")
# 打印元素的文本信息
print(textElement.text)
"""

"""
# 元素定位的第二种方式  xpath,根据 xpath 路径定位
# 寻找元素
textElement = driver.find_element_by_xpath("[表情]ml/body/div/p[2]")
# 打印元素的文本信息
print(textElement.text)
"""

"""
# 元素定位的第三种方式,根据 id 定位
# 寻找元素
inputElement = driver.find_element_by_id("58680504-89fc-42d4-ab86-afc9456f880e")
inputElement.send_keys("小红")
"""
"""
# 元素定位的第四种方式,根据 name
# 寻找元素
inputElement = driver.find_element_by_name("passwd")inputElement.send_keys("123")
"""

"""
# 元素定位的第五种方式,根据 class_name 定位
# 寻找元素
linkElement = driver.find_element_by_class_name("mnavspdot")linkElement.click()
"""

"""
# 元素定位的第六种方式,根据 tag_name 定位
# 寻找元素
tagElement = driver.find_element_by_tag_name("p")
# 打印标签的文本内容print(tagElement.text)
"""
"""
元素定位的第七种方式,根据链接文本,精准搜索
# 寻找元素
linkElement = driver.find_element_by_link_text("新冠病毒")
linkElement.click()
"""
"""
# 元素定位的第八种方式,根据链接文本,模糊搜索
# 寻找元素
linkElement = driver.find_element_by_partial_link_text("抗击")
linkElement.click()
"""
# 获取元素列表
tagElementSli = driver.find_elements_by_tag_name("p")
for i in tagElementSli:
	print(i.text)
#根据 css 选择器获取元素列表
inputElement = driver.find_elements_by_css_selector("body > div:nth-child(2) > input")
for i in inputElement:
	print(i.get_attribute("name"))

除了find_element_by_某某类型的定位方法(“元素定位表达式”),find_element() 函数也可以完成任务

from selenium import webdriver
# 需要先引入这个
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
inputElement = driver.find_element(By.ID, "58680504-89fc-42d4-ab86-afc9456f880e")
# 同样也有对应的获取列表的方法
inputElementSli = driver.find_elements(By.NAME, "pwd")

注意:
1、根据class_name进行定位的时候,有时候会遇到复合类,也就是class属性中间有空格,class属性比较特殊,class属性中间的空格是间隔符号,表示的是一个元素有多个class的属性名称,此时元素定位的时候任取一个即可(不保证唯一定位)
2、selenium没有提供判断元素是否存在的功能,所以当你需要判断一个元素存不存在的时候,直接定位可能会报错。我们可以去匹配一个元素列表,列表为空则元素不存在,列表不为空则元素存在技巧,在进行元素定位的时候,有时会遇到一些特别难以定位的元素,此时你可以使用下边这种模式,分步骤定位,一步步缩小定位范围

ele = driver.find_elements_by_xpath("//div[@id='category-block']//ol/li")
b = ele.find_elements_by_xpath('.//li[@class=\'subcate-item\']//span')

标签:大法,匹配,name,driver,元素,selenium,element,find,搭建
来源: https://blog.csdn.net/StruggleofDog/article/details/113936793