十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
# 版本
python==3.7.3
selenium==4.0.0a1
# selenium pypi地址
https://pypi.org/project/selenium/
在目录前提示一下,有时候我们在获取了一组元素,然后进行循环时,会报错'陈旧的元素.....',为了避免这个错误,建议在需要处理一组元素时,我们先算出元素的数量,然后通过range(element_counter),来通过索引值再次搜索需要处理的元素.
创新互联是一家专注于成都网站制作、网站建设与策划设计,云州网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:云州等地区。云州做网站价格咨询:028-86922220
目录:
一、初始化
二、元素查找
三、select标签操作
四、执行js脚本
五、通过js操作被遮挡元素
六、iframe操作
七、动作和动作链
八、异常处理
九、显式等待和预期条件
十、退出程序
一、初始化
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 新版的webdriver.chrome默认指定了谷歌浏览器的驱动程序位置,如果要自定义位置,需要实例化一个Service对象
service = Service(executable_path=revoction_config.chromedriverpath)
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(5) # 隐式等待未加载的元素
driver.get('http://www.baidu.com')
# 无头模式配置
opt = webdriver.ChromeOptions() # 创建chrome对象
opt.add_argument('--no-sandbox') # 启用非沙盒模式,linux必填
opt.add_argument('--disable-gpu') # 禁用gpu,linux部署需填,防止未知bug
opt.add_argument('headless') # 启用无头模式
driver = webdriver.Chrome(options=opt)
driver.implicitly_wait(5) # 隐式等待未加载的元素
driver.get('http://www.baidu.com')
二、元素搜索
直接搜索
# 一次查找一个
driver.find_element_by_id # 按id属性
driver.find_element_by_name # 按name属性
driver.find_element_by_xpath # 按XPath
driver.find_element_by_link_text # 按标签中的text过滤
driver.find_element_by_partial_link_text # 按标签中的text过滤,包含某字符串的text
driver.find_element_by_tag_name # 按标签名
driver.find_element_by_class_name # 按类属性
driver.find_element_by_css_selector # 通过css选择器查找
# 一次查找多个元素 (这些方法会返回一个list列表)
driver.find_elements_by_name
driver.find_elements_by_xpath
driver.find_elements_by_link_text
driver.find_elements_by_partial_link_text
driver.find_elements_by_tag_name
driver.find_elements_by_class_name
driver.find_elements_by_css_selector
2.使用By方法.
# 使用by方法和使用"直接搜索"的方式是一样的,只是书写不同
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH,Expression)
同等于
driver.find_element_by_xpath(Expression)
# 查找name属性等于username的input标签
driver.find_element(By.XPATH,"//input[@name='username']")
# 查看name属性以user开头的标签
driver.find_element(By.XPATH,"//input[starts-with(@name,'username')]")
# 如果你搜索出来的是多个元素
driver.find_elements()
3.XPath
XPath
有两种搜索方式,一种是绝对路径
一种是相对路径
.
找到body
中类属性为username
的div
标签.
# 绝对路径示例:
"/html/body/div[@class='username']"
# 相对路径示例:
"//div[@class='username']"
获取tbody
标签下所有的子标签.
"/table/tbody/*"
获取class
属性为username
的<a>
标签后的第一个标签.
/a[@class='username']/following-sibling::li[1]
查看name
属性以user
开头的标签.
"//input[starts-with(@name,'username')]"
三、select
标签操作(官方称之为:UI Support
).
from selenium.webdriver.support.select import Select
# step 1: 查找select标签并且示例化.
select_element = driver.find_element(By.XPATH,"//select[@class='address']")
select = Select(select_element)
# step 2: 通过option的text文本选中
select.select_by_visible_text('北京')
四、执行js
脚本.
# 比如在select标签中你想要的option不存在
java_scripts_text = '''d = document.getElementById('address');d.options.add(new Option("{0}","{0}"));'''.format('北京')
driver.execute_script(java_scripts_text)
# 然后再实例化Select并且选择text为北京的option即可
五、通过js
操作被遮挡元素
baidu_button = driver.find_element(By.XPATH,"//a[@name='baidu']")
driver.execute_script("arguments[0].click();", baidu_button)
六、iframe
操作.
要想操作iframe里面的元素,必须先进入iframe.
# 首先找到iframe标签
i = driver.find_element(By.XPATH, "//iframe")
# 进入iframe
driver.switch_to.frame(i)
# 退出iframe
driver.switch_to.default_content()
七、动作和动作链(官方称之为:Action Chains
).
动作
# 在input元素中输入text
input_element = find_element(By.XPATH,"//input[@name='username']")
input_element.send_keys('xiaoming')
# 点击元素
a_element = find_element(By.XPATH,"//a[@class='baidu']")
a_element.click()
动作链
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# 按住Ctrl键然后按鼠标左键点击a标签
a_element = find_element(By.XPATH,"//a[@class='baidu']")
ac = ActionChains(driver)
# 首先移动到a标签,然后按下左边的Ctrl键,再点击鼠标左键,最后释放左边的Ctrl键,并且执行这个动作链
ac.move_to_element(a_element).key_down(Keys.LEFT_CONTROL).click().key_up(Keys.LEFT_CONTROL).perform()
# 释:
key_down(): 按下某键
key_up(): 释放某键
send_keys(): 按下并且释放某键
click(): 单机鼠标左键
perform(): 执行动作链
八、异常处理(官方称之为:Exceptions
).
异常处理的类都在selenium.common.exceptions.*
中,要想捕捉selenium
的异常,必须先导入对象的类
from selenium.common.exceptions import NoSuchElementException
try:
a_element = driver.find_element(By.PARTIAL_LINK_TEXT, '百度')
except NoSuchElementException:
print("没有找到text为百度的a标签.")
九、显式等待和预期条件.
WebDriverWait(WebDriver实例, 最长等待时间, 每次检测时隔, 忽略的异常)
# 等待符合条件的元素加载出来,如果加载成功则返回WebElement
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
locator = (By.ID, "username")
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
注意: 注意你需要等待的是一组元素,则使用'presence_of_all_elements_located'实现.
# 判断元素是否可见并且可以点击,如果可以返回元素,不可以返回False
WebDriverWait(driver, 20, 0.5).until(EC.element_to_be_clickable(locator))
可见时点击
WebDriverWait(driver, 20, 0.5).until(EC.element_to_be_clickable(locator)).click()
十、退出程序.
driver.close()
driver.quit()