selenium

Selenium

  1. 什么是selenium?

  2. 安装
    pip install selenium

  3. 基本使用

    • 实例化Chrome Webdriver
    from selenium import webdriver
    browser = webdriver.Chrome()
    
    • browser.get()方法将打开URL中填写的地址,WebDriver 将等待, 直到页面完全加载完毕(其实是等到”onload” 方法执行完毕),然后返回继续执行你的脚本。但是如果页面使用了大量的Ajax加载, WebDriver可能不知道页面什么时候加载完成。
    url = 'https://www.baidu.com'
    browser.get(url)
    
    • 选择页面元素,提供了如下方式

      • find_element_by_id
      • find_element_by_name
      • find_element_by_xpath
      • find_element_by_link_text
      • find_element_by_partial_link_text
      • find_element_by_tag_name
      • find_element_by_class_name
      • find_element_by_css_selector
    • 一次查找多个元素 (返回list):

      • find_elements_by_name

      • find_elements_by_xpath

      • find_elements_by_link_text

      • find_elements_by_partial_link_text

      • find_elements_by_tag_name

      • find_elements_by_class_name

      • find_elements_by_css_selector

    • 除上述查找元素的方法外,还有两个私有方法find_element和find_elements

    from selenium.webdriver.common.by import By
    # By的可用属性分别为:ID、XPATH、LINK_TEXT、PARTIAL_TEXT、NAME、CLASS_NAME、CSS_SELECTOR
    
    driver.find_element(By.XPATH, '//button[text()="Some text"]')
    driver.find_elements(By.XPATH, '//button')
    
    • 显式等待
      因为现在很多页面中都大量使用了Ajax,会造成页面中不同的元素加载完成的时间不同,就使得查找页面元素有时会不成功,为了解决这种问题,可以使用waits。waits提供了一些操作之间的时间间隔---主要是定位元素或针对该元素的任何其他操作。
      显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
    finally:
        driver.quit()
    

    expected_conditions 模块提供了一组预定义的条件供WebDriverWait使用。

    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
    
    • 隐式等待
      让Webdriver等待一定的时间后再才是查找某元素。
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(10) # seconds
    driver.get("http://somedomain/url_that_delays_loading")
    myDynamicElement = driver.find_element_by_id("myDynamicElement")
    
    • 向input框中输入值
    browser.find_element_by_id('kw').send_keys('Python')
    
    • 提交
    browser.find_element_by_id('submit')
    
    • 其他常用操作
    page_source  # 页面源码 
    execute_script('js')  # 执行js代码
    fullscreen_window()  # 浏览器全屏
    get_screenshot_as_base64()  # 截屏保存为base64格式
    get_screenshot_as_file(filename)  # 截屏保存为文件
    get_screenshot_as_png()  # 截屏保存为png
    save_screenshot(filename)  # 同上
    quit()  # 关闭浏览器
    close()  # 关闭当前Tab页面
    refresh()  # 刷新页面
    switch_to_frame(frame_reference)  # 切换到另一个frame
    更多请查看:https://selenium-python-zh.readthedocs.io/en/latest/api.html
    
  4. Chrome无头模式设置

from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
  1. 为什么selenium不能被用于线上项目?(除非可以检测使用的浏览器版本)
    无法预知用户端使用的是什么浏览器,如果用户使用的浏览器和我们代码都得Webdriver版本不对应,可能出现无法正常工作的现象,所以一般上线不使用selenium。
  2. 虚假UserAgent
from fake_useragent import UserAgent
ua = UserAgent(verify_ssl=False, use_cache_server=False).random
原文地址:https://www.cnblogs.com/tmdhhl/p/selenium.html