selenium

作者: nnlrl | 来源:发表于2020-05-22 15:34 被阅读0次

简介

  • Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持所有主流浏览器包括界面化和无界面化

  • 在使用之前首先需要安装chromedriver(http://npm.taobao.org/mirrors/chromedriver/)

from selenium import webdriver
import time

if __name__ == '__main__':
    #创建浏览器对象
    driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
    #请求页面
    driver.get('http://www.baidu.com/')

    #页面基本操作
    driver.find_element_by_id('kw').send_keys('狗')         #输入
    driver.find_element_by_id('su').click()                         #点击

    #页面截屏
    time.sleep(2) # 设置时间间隔防止截不到屏
    driver.save_screenshot('baidu.png')

    #获取渲染之后的数据
    print(driver.page_source) # 获取页面渲染后的数据
    print(driver.get_cookies()) # 获取当前页面cookie值
    print(driver.current_url) # 查看当前url路径

    # 关闭浏览器
    # driver.close() # 关闭页面
    # driver.quit() # 关闭浏览器

几步简单的操作我们便可以使用selenium使用浏览器使用百度搜索并进行截屏

元素定位

  • 得到页面之后,selenium还为我们获得了渲染后的源码,我们可以使用xpath,css,re等方法对元素进行定位,在selenium中常用的定位函数包括:
    find_element_by_id/根据id属性获取元素列表
    find_element_by_class_name/根据类名获取元素列表
    find_element_by_xpath/根据xpath语法获取元素列表
    find_element_by_link_text/根据标签的文本获取元素列表,精确定位
    find_element_by_partial_link_text/根据标签包含的文本获取元素列表,模糊定位
    find_element_by_tag_name/根据标签名获取元素列表
from selenium import webdriver
#以豆瓣为例

if __name__ == '__main__':
    driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
    driver.get('http://www.douban.com/')

    # find_element_by_id/根据id属性获取元素列表
    results = driver.find_element_by_id('anony-nav')  #标签对象
    print(results)

    # find_elements_by_id/根据id属性获取多个标签
    results = driver.find_elements_by_id('anony-nav')  #获取多个标签 --list
    print(results)

    # find_elements_by_class_name/根据类名获取元素列表
    results = driver.find_elements_by_class_name('anony-nav-links')
    print(results)

    # find_elements_by_xpath/根据xpath语法获取元素列表
    results = driver.find_elements_by_xpath('//*[@id="anony-nav"]/h1/a')
    print(results)

    # find_element_by_link_text/根据标签的文本获取元素列表,精确定位
    results = driver.find_element_by_link_text('下载豆瓣 App')
    print(results)

    # find_elements_by_partial_link_text/根据标签包含的文本获取元素列表,模糊定位
    results = driver.find_elements_by_partial_link_text('豆瓣')
    print(len(results))

    # find_elements_by_tag_name/根据标签名获取元素列表
    results = driver.find_elements_by_tag_name('div')
    print(len(results))

    # 获取标签的文本内容
    results = driver.find_element_by_tag_name('h1')
    print(results.text)

我们可以分析页面源码并使用id,xpath,css,text进行定位,如果我们想要定位的元素不止一个,那么可以使用find_elements_by_tag_name定位标签或者
find_elements_by_partial_link_text搜索关键字,并返回一个列表

切换窗口

switch 切换浏览器窗口
首先获取所有窗口,current_windows = driver.windows_handles
根据窗口索引进行切换driver.switch_to.window(current_windows[1])

from selenium import webdriver
import time

if __name__ == '__main__':
    driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
    driver.get('http://www.douban.com/')

    #实现浏览器窗口切换
    driver.find_element_by_xpath('//*[@id="anony-nav"]/div[1]/ul/li[2]/a').click()
    current_windows = driver.window_handles
    print(current_windows)
    driver.switch_to.window(current_windows[0])

    # 实现页面的前进和后退
    driver.find_element_by_xpath('//*[@id="anony-sns"]/div/div[3]/div/div[1]/ul/li[2]/div/a/img').click()
    time.sleep(1)
    driver.back()
    time.sleep(1)
    driver.forward()

    # 进入嵌套网页登录网页 frame
    driver.switch_to.frame(0)
    driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    driver.find_element_by_xpath('//*[@id="username"]').send_keys('...')
    driver.find_element_by_xpath('//*[@id="password"]').send_keys('...')
    driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

实现淘宝网页登陆的抢购小程序

  • 实现扫码登陆淘宝到时间进行抢购
from selenium import webdriver
import datetime
import time

if __name__ == '__main__':
    driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
    time.sleep(3)
    driver.get('https://www.taobao.com')
    if driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]'):
        driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()
        driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
        print('请在10秒内完成扫码')
        time.sleep(10)
        driver.get("https://cart.taobao.com/cart.htm")
    time.sleep(3)

    now = datetime.datetime.now()
    print('login success:', now.strftime('%Y-%m-%d %H:%M:%S'))

    while True:
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
        # times = "2020-05-20 12:12:12.000000"
        # if now > times:
        while True:
            try:
                if driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div/label'):
                    driver.find_element_by_xpath('//*[@id="J_SelectAll1"]/div/label').click()
                    break
            except:
                print("下单失败")

        while True:
            try:
                if driver.find_element_by_xpath('//*[@id="J_Go"]/span'):
                    driver.find_element_by_xpath('//*[@id="J_Go"]/span').click()
                    print("结算成功")
                    break
            except:
                print('结算失败')

        while True:
            try:
                if driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]'):
                    driver.find_element_by_xpath('//*[@id="submitOrderPC_1"]/div/a[2]').click()
                    now1 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
                    print("抢购成功时间:%s" % now1)
            except:
                print("再次尝试提交订单")
        time.sleep(0.01)

获取网易云音乐评论

selenium可以获得js动态渲染之后的页面,在也不用解析页面了,使用selenium获取页面并获得源码,使用xpath解析源码获取评论

在获取下一页的时候遇到了一些错误selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point. Other element would receive the click随后尝试了一些办法,下滑页面,窗口定位还是没用。最后是发现下一页的元素被覆盖了,使用按键(keys)代替点击(click)解决问题。

import time
import requests
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


def crawl_comments(song): # 爬取网易云评论
    driver = webdriver.Chrome(executable_path='/path/chromedriver.exe')
    driver.get('http://music.163.com/#/search/m/')
    driver.switch_to.frame('contentFrame')
    time.sleep(1)
    song_name = driver.find_element_by_xpath("//input[@id='m-search-input']")
    search_button = driver.find_element_by_xpath("//a[@title='搜索']")
    song_name.send_keys(song)
    search_button.click()

    driver.get(driver.current_url) # 得到当前页面
    time.sleep(1)
    driver.switch_to.frame('contentFrame')
    song_button = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/div/div[1]/div[2]/div/div/a')
    song_button.click()

    # 方法一:窗口定位到指定位置
    # next_button = driver.find_element_by_xpath("//div[@class='m-cmmt']/div[3]/div[1]/a[11]")
    # ActionChains(driver).move_to_element(next_button).perform()
    
    # 方法二:下滑窗口
    # js = "window.scrollTo(100,450)"
    # driver.execute_script(js)

    while True:
        try:
            html = driver.page_source
            selector = etree.HTML(html)
            boxes = selector.xpath("/html/body/div[3]/div[1]/div/div/div[2]/div/div[2]/div[2]/div//div[@class='cnt f-brk']/text()")
            next_button = driver.find_element_by_xpath("//div[@class='m-cmmt']/div[3]/div[1]/a[11]")
            # 使用按键代替点击操作
            next_button.send_keys(Keys.ENTER)
            for i in range(len(boxes)):
                print(boxes[i])
            time.sleep(3)
        except:
            pass


if __name__ == '__main__':
    crawl_comments('fade')

相关文章

网友评论

      本文标题:selenium

      本文链接:https://www.haomeiwen.com/subject/womqahtx.html