Selenium基本操作

[亡魂溺海] 提交于 2020-02-26 14:12:33

一、定位元素

Selenium有两类八种定位元素的方式。

1. 单个元素定位

  1. 基本方式
No.定位方式方法说明
1 ID定位 browser.find_element_by_id("ID名") HTML标签ID属性
2 名字定位 browser.find_element_by_name("名字") HTML表单标签名字属性
3 标签名定位 browser.find_element_by_tag_name("标签名") HTML标签
4 类名定位 browser.find_element_by_class_name("类名") HTML标签class属性
5 CSS选择器定位 browser.find_element_by_css_selector("CSS选择器") CSS选择器
6 XPath定位 browser.find_element_by_xpath("xpath") xpath
7 链接文字 browser.find_element_by_link_text("链接文字") a标签文本完全匹配
8 部分链接文字 browser.find_element_by_link_text("部分链接文字") a标签文本部分匹配
  • 实践
    以百度的Logo图片和输入框为例
<img hidefocus="true" class="index-logo-src" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129" usemap="#mp">
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

验证代码

from selenium import webdriver
import time
if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    time.sleep(2)
    # 浏览器最小化(这步只是为了演示方便,可以省略)
    browser.minimize_window()

    print("选取Baidu图标")
    # 标签名定位
    print(browser.find_element_by_tag_name("img"))
    # 类名定位
    print(browser.find_element_by_class_name("index-logo-src"))
    # CSS选择器定位
    print(browser.find_element_by_css_selector(".index-logo-src"))
    # XPath定位
    print(browser.find_element_by_xpath("//img[@class='index-logo-src']"))

    print("选取输入框")
    # ID定位
    print(browser.find_element_by_id("kw"))
    # 名字定位
    print(browser.find_element_by_name("wd"))
    # 标签名定位
    print(browser.find_element_by_tag_name("input"))
    # 类名定位
    print(browser.find_element_by_class_name("s_ipt"))
    # CSS选择器定位
    print(browser.find_element_by_css_selector("input#kw"))
    # XPath定位
    print(browser.find_element_by_xpath("//input[@id='kw']"))

    time.sleep(2)
    # 浏览器关闭
    browser.quit()
  1. 通用方式
    需要加上引用
from selenium.webdriver.common.by import By

上面实例可以改写成

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    time.sleep(2)
    # 浏览器最小化(这步只是为了演示方便,可以省略)
    browser.minimize_window()

    print("选取Baidu图标")
    # 标签名定位
    print(browser.find_element(By.TAG_NAME, "img"))
    # 类名定位
    print(browser.find_element(By.CLASS_NAME, "index-logo-src"))
    # CSS选择器定位
    print(browser.find_element(By.CSS_SELECTOR, ".index-logo-src"))
    # XPath定位
    print(browser.find_element(By.XPATH, "//img[@class='index-logo-src']"))

    print("选取输入框")
    # ID定位
    print(browser.find_element(By.ID, "kw"))
    # 名字定位
    print(browser.find_element(By.NAME, "wd"))
    # 标签名定位
    print(browser.find_element(By.TAG_NAME, "input"))
    # 类名定位
    print(browser.find_element(By.CLASS_NAME, "s_ipt"))
    # CSS选择器定位
    print(browser.find_element(By.CSS_SELECTOR, "input#kw"))
    # XPath定位
    print(browser.find_element(By.XPATH, "//input[@id='kw']"))

    time.sleep(2)
    # 浏览器关闭
    browser.quit()

关于链接的定位

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    time.sleep(2)
    # 浏览器最小化(这步只是为了演示方便,可以省略)
    browser.minimize_window()

    # 链接定位
    print(browser.find_element_by_link_text("关于百度"))
    # 部分链接定位
    print(browser.find_element_by_partial_link_text("关于"))

    # 链接定位
    print(browser.find_element(By.LINK_TEXT, "关于百度"))
    # 部分链接定位
    print(browser.find_element(By.PARTIAL_LINK_TEXT, "关于"))

    time.sleep(2)
    # 浏览器关闭
    browser.quit()

2. 多个元素定位

  • 基本方式
    与上面的操作对应多个元素的定位,区别在于,单个元素定位函数名是find_element_by_*,返回值是一个元素;多个元素定位函数名是find_elements_by_*,返回值为多个元素组成的序列。
  • 通用方式
browser.find_elements()

定位原则:不管白猫黑猫抓住老鼠就是好猫


 
 

实例:selenium批量抓取猫眼电影Top100信息http://maoyan.com/board/4

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep, time

if __name__ == "__main__":

    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    start = time()

    # Chrome浏览器以Get方式访问百度
    browser.get("http://maoyan.com/board/4")
    sleep(2)  # 强制等待

    # 定位输入框
    dds = browser.find_elements_by_tag_name("dd")
    for dd in dds:
        print("index:", dd.find_element_by_tag_name("i").text)
        print("image:", dd.find_element_by_class_name("board-img").get_attribute("data-src"))
        print("title:", dd.find_element_by_css_selector("p.name").text)
        print("star:", dd.find_element_by_css_selector("p.star").text.strip()[3:])
        print("releasetime:", dd.find_element_by_xpath("//p[@class='releasetime']").text[5:])
        print("score:",
              dd.find_element_by_css_selector("i.integer").text + dd.find_element_by_css_selector("i.fraction").text)
    # print(browser.page_source) # 页面代码

    # 用于延长展示时间
    sleep(2)
    end = time()
    print("Run time:", end - start)
    # 浏览器关闭
    browser.quit()

二、页面操作

  1. 页面交互

常用操作

No.方法功能
1 element.click() 按钮单击
2 element.send_keys("字符串") 输入框输入字符串
3 element.clear() 清空输入框
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    sleep(2)

    # 浏览器最大化(这步只是为了演示方便,可以省略)
    browser.maximize_window()

    # 定位输入框,并输入框填写查询文字
    browser.find_element_by_id("kw").send_keys("你好,Selenium")

    # 定位[百度一下]按钮,并单击
    browser.find_element_by_id("su").click()

    sleep(2)
    # 浏览器关闭
    browser.quit()

模拟回车按键,代替单击按钮

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    sleep(2)
    # 浏览器最小化
    browser.maximize_window()

    # 定位输入框
    input = browser.find_element_by_id("kw")
    # 输入框填写查询文字
    input.send_keys("你好,Selenium")
    # 回车
    input.send_keys(Keys.RETURN)

    sleep(4)
    # 浏览器关闭
    browser.quit()

操作网页的下拉

网易注册http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi&regPage=163

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from time import sleep

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get('http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi&regPage=163')
    driver.implicitly_wait(2)

    # 定位select元素,并创建Select对象
    select = Select(driver.find_element_by_id("mainDomainSelect"))

    # 按照下标选择
    select.select_by_index(2)
    sleep(2)

    # 按照文本选择
    select.select_by_visible_text("163.com")
    sleep(2)

    # 按照值选择
    select.select_by_value("126.com")
    sleep(2)
    driver.quit()

三、页面操作

1. 页面等待

Selenium有两种等待方式,加上标准库的time.sleep(),下面做一下比较。

No.方法模块导入方式特点等待对象
1 sleep() time from time import sleep() 强制等待,固定休眠时间 等待时间到了
2 implicitly_wait() webdirver from selenium import webdriver 隐式等待定位元素,超时抛出异常 等待页面加载完成
3 WebDriverWait() webdirver from selenium.webdriver.support.ui import WebDriverWait 显式等待(每隔一段时间检测元素),超时抛出异常NoSuchElementException 等待元素加载完成
  • 强制等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep, time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    start = time()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    sleep(2)  # 强制等待
    # 浏览器最大化
    browser.maximize_window()

    # 定位输入框
    input = browser.find_element_by_id("kw")
    # 输入框填写查询文字
    input.send_keys("你好,Selenium")
    # 回车
    input.send_keys(Keys.RETURN)
    # 用于延长展示时间
    sleep(2)
    end = time()
    print("Run time:", end - start)
    # 浏览器关闭
    browser.quit()
  • 隐式等待
    隐式等待使用与time.sleep()相似。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep, time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    start = time()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    try:
        browser.implicitly_wait(2)  # 隐式等待
        # 浏览器最大化
        browser.maximize_window()

        # 定位输入框
        input = browser.find_element_by_id("kw")
        # 输入框填写查询文字
        input.send_keys("你好,Selenium")
        # 回车
        input.send_keys(Keys.RETURN)
        # 用于延长展示时间
        sleep(2)
        end = time()
        print("Run time:", end - start)
    finally:
        # 浏览器关闭
        browser.quit()
  • 显式等待
    显式等待可以直接使用。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep, time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    start = time()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    # 浏览器最大化
    browser.maximize_window()
    try:
        # 隐式等待,定位输入框
        WebDriverWait(browser, 2)
        # 定位输入框
        input = browser.find_element_by_id("kw")
        # 输入框填写查询文字
        input.send_keys("你好,Selenium")
        # 回车
        input.send_keys(Keys.RETURN)
        # 用于延长展示时间
        sleep(2)
        end = time()
        print("Run time:", end - start)
    finally:
        # 浏览器关闭
        browser.quit()

显式等待通常与until()方法一起使用,参数为等待的条件。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep, time

if __name__ == "__main__":
    # 获取Chrome浏览器
    browser = webdriver.Chrome()
    start = time()
    # Chrome浏览器以Get方式访问百度
    browser.get('http://www.baidu.com/')
    # 浏览器最大化
    browser.maximize_window()
    try:
        # 隐式等待,定位输入框
        input = WebDriverWait(browser, 2).until(
            EC.presence_of_element_located((By.ID, "kw"))
        )
        # 输入框填写查询文字
        input.send_keys("你好,Selenium")
        # 回车
        input.send_keys(Keys.RETURN)
        sleep(2)
        end = time()
        print("Run time:", end - start)
    finally:
        # 浏览器关闭
        browser.quit()

可以同时设置隐式等待和显式等待,等待是两者之间的最大者。

2. 多窗体操作

No.操作方法
1 获取当前窗口句柄 driver.current_window_handle
2 获取所有窗口句柄 driver.window_handles
3 切换到handle的窗口 driver.switch_to.window(handle)
4 关闭当前的窗口 driver.close()

说明
driver.close()相当于关闭当前TAB选项卡
driver.quit()是退出了整个浏览器

窗口句柄是窗口的唯一标识,可看做窗口的身份证号。

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome()
    # 打印当前窗口句柄
    driver.get('http://xueshu.baidu.com/')
    print(driver.current_window_handle)
    driver.implicitly_wait(2)

    # 定位导航栏上的链接,并依次打开
    pages = driver.find_elements_by_css_selector('#nav_tab>a')
    for page in pages:
        page.click()

    # 打印所有的窗口句柄
    print(driver.window_handles)

    # 依次切换每个窗口
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        print(driver.title,driver.current_window_handle)
        time.sleep(1)

    # 依次关闭每个窗口
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        driver.close()
        time.sleep(1)

JS操作

selenium调用js基本方式

driver.execute_script("JavaScript代码")

1. 网页提示框

from selenium import webdriver
from time import sleep

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.execute_script("alert('Helle Selenium')")

    # 获取alert框
    alert = driver.switch_to.alert

    # 打印alert框文本
    print(alert.text)
    sleep(2)

    # 单击确认按钮
    alert.accept()

    # 暂停5s
    sleep(5)

    # 关闭浏览器
    driver.quit()

2. selenium模拟操作HTML5视频

from selenium import webdriver
from time import sleep

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.get("https://www.bilibili.com/video/av33301840?spm_id_from=333.334.b_62696c695f646f756761.9")
    driver.implicitly_wait(3)

    # 获取视频元素
    video = driver.find_element_by_css_selector(".bilibili-player-video>video")

    # 打印视频src属性
    print(video.get_attribute("src"))

    # 打印当前视频的地址(JS方式)
    print(driver.execute_script("return arguments[0].currentSrc;", video))

    # 播放视频
    print("start")
    driver.execute_script("return arguments[0].play()", video)

    # 播放15s
    sleep(15)

    # 暂停播放
    print("stop")
    driver.execute_script("return arguments[0].pause()", video)

    # 暂停5s
    sleep(5)

    # 关闭浏览器
    driver.quit()


作者:jdzhangxin
链接:https://www.jianshu.com/p/1713de50265e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!