# 版本
    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()