Python selenium使用入门
admin
2023-07-06 14:44:38
0次
# 版本
    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')

二、元素搜索

  1. 直接搜索

    # 一次查找一个
    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).

  1. 动作

    # 在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()
  2. 动作链

    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()

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...