【Python】selenium 安装配置


简介

  selenium 是一个用于Web应用程序测试的工具。

  Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

  支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。

  这个工具的主要功能包括:

    测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。

    测试系统功能——创建衰退测试检验软件功能和用户需求。

    支持自动录制动作和自动生成。Net、Java、Perl等不同语言的测试脚本。

    Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具

 

安装

pip install selenuim

引用

from selenium import webdriver

配置

把driver放在python的Scripts路径下,同时把script路径加入环境变量

谷歌驱动【chromedriver】下载地址:http://chromedriver.storage.googleapis.com/index.html
火狐历史版本下载地址: http://ftp.mozilla.org/pub/firefox/releases/
火狐驱动【geckodriver】下载地址: https://github.com/mozilla/geckodriver/releases
IE浏览器驱动【IEdriver】下载地址: 

    http://dl.pconline.com.cn/download/771640-1.html

    http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/

实践


打开火狐浏览器

    def firefox():
        firefox_browser = webdriver.Firefox()  # webdriver.我们想操控的浏览器,这个可以换
        time.sleep(3)  # 等待三秒
        firefox_browser.get("https://www.baidu.com")  # 在火狐浏览器内打开百度页面
        time.sleep(3)
        firefox_browser.find_element_by_id("kw").send_keys("selenium")  # 元素定位
        time.sleep(3)
        firefox_browser.find_element_by_id("su").click  # 模拟用户点击
        firefox_browser.quit()  # 操作完调用quit关闭掉浏览器

谷歌浏览器 


参考网址:www.baidu.com

打开浏览器

    def chrome():
        chrome_browser = webdriver.Chrome()     # 打开Google浏览器
        chrome_browser.implicitly_wait(10)   # 隐式等待5s 超时时间,使用一次作用域find_element
        chrome_browser.get("https://www.baidu.com")     # 打开网址
        # chrome_browser.get(r"D:\html\bookmarks_2022_1_17.html")   # 打开本地html页面
        print("网址标题:", chrome_browser.title)
        print("网址url:", chrome_browser.current_url )
        time.sleep(5)  # 休眠5s
        chrome_browser.quit()   # 3s后操作完调用quit关闭掉浏览器
        # chrome_browser.close()  # 3s操作完close强制关闭浏览器,会出现OSError 句柄无效异常        

元素定位

link_text 文本链接定位元素 

        # 根据link_text定位元素 准确定位 标签需要是才能定位到
        chrome_browser.find_element_by_link_text("新闻")
# 根据link_text定位元素 模糊定位 标签需要是才能定位到 chrome_browser.find_element_by_partial_link_text("涨价")
# 元素定位 模拟用户点击 chrome_browser.find_element_by_link_text("贴吧").click()

tag_name 标签名定位

    # 根据标签name查找元素
       chrome_browser.find_elements_by_tag_name('input')

根据id、name、class元素定位 模拟输入

     # 根据id查找元素,.send_keys 输入信息 selenium
        chrome_browser.find_element_by_id('kw').send_keys('selenium')
# 根据name查找元素,找到并输入 webdriver chrome_browser.find_element_by_name('wd').send_keys('webdriver')
# 根据class查找元素,并输入信息 hello world chrome_browser.find_element_by_class_name("s_ipt").send_keys('hello world')

根据id、class元素定位 模拟点击

        # 根据id查找元素,模拟用户进行点击
        chrome_browser.find_element_by_id('su').click()
# 根据class name查找元素,模拟用户进行点击 chrome_browser.find_element_by_class_name('s_btn').click()
    def baidu_selenium(self):
        """ 百度搜索selenium """
        driver = webdriver.Chrome()    # 打开Google浏览器
        driver.implicitly_wait(5)   # 未找到控件时 隐式等待5s
        driver.get("http://www.baidu.com")     # 打开网址
        print("页面标题:", driver.title)
        print("页面url:", driver.current_url)

        time.sleep(3)   # 强制等待3s
        input_box = driver.find_element_by_class_name("s_ipt")  # class 元素定位
        input_box.send_keys("selenium")     # 模拟用户输入
        print("元素 标签名:", input_box.tag_name)
        print("元素 位置:", input_box.location)
        print("元素 大小:", input_box.size)
        print("selenium_id:", input_box.id)
        print("获取id属性:", input_box.get_attribute("id"))
        print("获取name属性:", input_box.get_attribute("name"))
        print("获取class属性:", input_box.get_attribute("class"))

        time.sleep(5)    # 强制等待5s
        baidu_button = driver.find_element_by_id('su')   # id 元素定位
        baidu_button.click()    # 模拟用户点击
        print("获取id属性:", baidu_button.get_property("id"))
        print("获取class属性:", baidu_button.get_attribute("class"))


        time.sleep(5)
        driver.find_element_by_name("wd").clear()    # name 元素定位 模拟用户清空输入框


        time.sleep(5)
        driver.quit()  # 关闭浏览器
示例

Xpath

表达式      描述
nodename    选取此节点的所有子节点。
/        从根节点选取(取子节点)。
//        从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.        选取当前节点。
..       选取当前节点的父节点。
@        选取属性。

 切换选项卡

        all_tab = driver.window_handles     # 获取所有选项卡 ,all_tab 类型为 list
        print(all_tab)
        time.sleep(3)
        driver.switch_to.window(all_tab[1])  # 切换选项卡
        print(driver.title)    
    def tieba(self):
        """ 贴吧 """
        driver = webdriver.Chrome()
        driver.get("http://www.baidu.com")
        driver.find_element_by_link_text("贴吧").click()
        all_tab = driver.window_handles     # 获取所有选项卡
        print(all_tab)

        time.sleep(3)
        driver.switch_to.window(all_tab[1])  # 切换选项卡
        print(driver.title)
        driver.find_element_by_link_text("百度首页").click()    # 对贴吧进行操作
        

        time.sleep(3)
        driver.switch_to.window(driver.window_handles[0])   # 再次切换选项卡
        print(driver.title)

        time.sleep(5)
        driver.find_element_by_id("kw").send_keys("微博")     # 对百度进行搜索
        time.sleep(3)
        driver.find_element_by_id("su").click()

        time.sleep(5)
        driver.quit()
示例

执行结果:

拓展


参考链接:  

问题一:元素不可交互

  selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

  可能原因,加延迟等待几秒在查找元素

  time.sleep(5)

问题二: