# 版本
python==3.7.3
selenium==4.0.0a1
# selenium pypi地址
https://pypi.org/project/selenium/
在目录前提示一下,有时候我们在获取了一组元素,然后进行循环时,会报错'陈旧的元素.....',为了避免这个错误,建议在需要处理一组元素时,我们先算出元素的数量,然后通过range(element_counter),来通过索引值再次搜索需要处理的元素.
目录:
一、初始化
二、元素查找
三、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()