Selenium

2023-07-31 15:11:04 浏览数 (2)

安装selenium

代码语言:javascript复制
pip install selenium

安装驱动

驱动安装地址:

  • Firefox 浏览器驱动:https://github.com/mozilla/geckodriver/releases
  • Chrome 浏览器驱动:https://chromedriver.storage.googleapis.com/index.html
  • IE 浏览器驱动:http://selenium-release.storage.googleapis.com/index.html
  • Edge 浏览器驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  • PhantomJS 浏览器驱动:https://phantomjs.org/
  • Opera 浏览器驱动:https://github.com/operasoftware/operachromiumdriver/releases

将驱动放到项目目录下,或者为驱动路径配置环境变量,也可以直接指定驱动路径。

代码语言:javascript复制
#  指定驱动路径
driver = webdriver.Chrome(executable_path=path)

使用示例

代码语言:javascript复制
from selenium import webdriver


#  Chrome浏览器
#  保持浏览器打开状态
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
driver = webdriver.Chrome(chrome_options=option)
#  设置参数
url = 'https://leafbackaut.cn/'
#  发起请求
driver.get(url)

元素定位

元素定位可以根据id,class等属性定位,也可以根据标签名等信息进行定位。使用定位函数后会返回一个WebElement类或一个WebElement类的列表,用于接下来的操作。

旧版元素定位

根据id定位

代码语言:javascript复制
driver.find_element_by_id(id)

根据name定位

代码语言:javascript复制
driver.find_element_by_name(name)

根据class定位(返回列表)

代码语言:javascript复制
driver.find_elements_by_class_name(class_name)

根据tag定位(返回列表)

代码语言:javascript复制
driver.find_elements_by_tag_name(tag_name)

根据xpath定位

代码语言:javascript复制
driver.find_element_by_xpath(xpath)

根据css选择器定位(返回列表)

代码语言:javascript复制
driver.find_element_by_css_selector(css_selector)

根据文本定位(标签必须包含全部文本)(返回列表)

代码语言:javascript复制
driver.find_element_by_link_text(text)

根据部分文本定位(返回列表)

代码语言:javascript复制
driver.find_element_by_partial_link_text(text)

新版元素定位(推荐)

新版元素定位将所有定位函数封装成两个函数

代码语言:javascript复制
#  返回定位到的第一个元素
find_element(self, by=By.ID, value=None)
#  返回列表
find_elements(self, by=By.ID, value=None)

其中By的属性如下:

代码语言:javascript复制
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

使用方法:

代码语言:javascript复制
from selenium.webdriver.common.by import By


#  通过class定位元素
driver.find_elements(By.CLASS_NAME, 'hello')
#  也可以不传入By,直接用属性值
driver.find_element('id', 'world')

元素等待

当元素还没有被加载出来时,会因为定位元素失败而报错,因此需要使用元素等待来保证程序正常运行。

显式等待

设置一个超时时间,期间确定某个条件触发,则继续运行程序,否则抛出异常。

代码语言:javascript复制
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

参数说明:

  • driver:浏览器驱动
  • timeout:超时时间,单位秒
  • poll_frequency:每次检测的间隔时间,默认为0.5秒
  • ignored_exceptions:指定忽略的异常,默认为NoSuchElementException

判断条件:

代码语言:javascript复制
until(method, message='')
until_not(method, message='')

参数说明:

  • method:每隔一段时间调用这个方法
  • message:如果超时,抛出TimeoutException,并显示message中的内容

使用示例:

代码语言:javascript复制
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.Chrome()
url = 'https://leafbackaut.cn/'
driver.get("url")
#  元素等待
#  锁定id为world的元素
try:
    element = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID,"world"))
    )
finally:
    driver.quit()

EC包含了许多通用判断条件,具体如下:

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

隐式等待

设置一个超时时间,如果超出这个时间,还有元素没有被加载出来,就会抛出NoSuchElementException异常,没超时则不影响后面的代码运行。

代码语言:javascript复制
#  time_to_wait为等待时间,单位为s
implicitly_wait(self, time_to_wait)

使用示例:

代码语言:javascript复制
from selenium import webdriver


#  打开浏览器
driver = webdriver.Chrome(chrome_options=option)
url = 'https://leafbackaut.cn/'
driver.get(url)

#  隐式等待
driver.implicitly_wait(5)
try:
    driver.find_element_by_id('hello')
except Exception as e:
    print(e)

0 人点赞