Selenium认识与实战(学习版)

Selenium认识与实战(学习版),第1张

Selenium认识

Selenium是什么

这里引用Selenium中文网的介绍:

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

Selenium 是web自动化测试工具集,包括IDE、Grid、RC(selenium 1.0)、WebDriver(selenium 2.0)等。

Selenium IDE 是firefox浏览器的一个插件。提供简单的脚本录制、编辑与回放功能。

Selenium Grid 是用来对测试脚步做分布式处理。现在已经集成到selenium server 中了。

RC和WebDriver 更多应该把它看成一套规范,在这套规范里定义客户端脚步与浏览器交互的协议。以及元素定位与 *** 作的接口。

Selenium的发展

Selenium 诞生于 2004 年,Selenium RC(远程控制)和 Selenium ID诞生也就是Selenium1,由于它使用的是基于Javascript的自动化引擎,浏览器对于Javascript的使用有诸多限制,使得Selenium的使用非常艰难。2006年出现了一个新项目WebDriver,这一项目主要目的是为了解决JavaScript环境沙箱(沙箱是一种按照安全策略限制程序行为的执行环境。)问题,能够能通过浏览器和 *** 作系统的本地方法直接和浏览器进行通话。2008年Selenium和WebDriver两项目合并,这就是Selenium2。2016 年,Selenium 3 诞生。移除了不再使用的 Selenium 1 中的 Selenium RC,并且官方重写了所有的浏览器驱动。

Selenium的安装

使用Pych

arm直接安装:

Selenium快速入门

1.Selenium八种元素定位方法:

  1. id定位
  2. name定位
  3. class name定位
  4. tag name定位
  5. link text定位
  6. partial link text定位
  7. xpath定位
  8. css selector定位

最新版的selenium库淘汰了八种定位方法语句,改为使用find_elements(by='定位方法', value='内容')来定位。

2.Selenium库常用的方法

  1. set_window_size()    #设置浏览器窗口大小
  2. back()    #控制浏览器回退
  3. forward()    #控制浏览器前进
  4. refresh()    #刷新当前页面
  5. clear()    #清空文本
  6. send_keys('value')    #模拟输入
  7. click()    #单击元素
  8. submit()    #提交表单
  9. get_attribute(name)    #获取元素属性
  10. is_displayed()    #设置元素用户是否可见
  11. size()    #设置元素尺寸
  12. text    #获取元素文本

Selenium实战练习

这里通过一个淘宝“抢购”脚本来练习学习一下Selenium的基础 *** 作。

# 导包
from selenium import webdriver
import time
import json
from selenium.webdriver.common.by import By

我们先进入淘宝将整个流程 *** 作一遍。大致可以得出以下流程

  1. 进入淘宝登陆页面(账号密码登陆/二维码登陆)
  2. 登陆成功进入购物车(可以点击页面购物车按钮/访问购物车链接)
  3. 等待抢购时间到达
  4. 选择购物车中的商品(此处简化购物车中只有待“抢购”商品,直接点击全选按钮)
  5. 点击“结算”按钮
  6. 点击“提交订单”(提交订单即为锁单成功,可以手动支付)
代码实现

        登录界面可以通过三种方法登陆,由于使用cookie登陆不稳定这里使用通过二维码扫码登陆。

def login2():
    driver.find_element(By.XPATH, '//*[@id="login"]/div[1]/i').click()

    # 扫码登陆
    print('扫码')
    # 设置等待时间
    time.sleep(10)
    print('即将开始')
    # driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]').click()
    time.sleep(3)

在开始之前我们要先设置一个请求头User-Agent(用户代理),它可以让服务器识别你使用的 *** 作系统版本、CPU类型、浏览器信息等等。如果不去设置这个信息,直接使用爬虫打开就会出现访问错误、无权限等错误信息。

if __name__ == '__main__':
    # 抢购时间设置
    # 获取电脑现在的时间,                      year month day
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
    times = f'{now[:8]}{input("日:")} {input("时:")}:{input("分:")}:{input("秒:")}.000000'
    
    # 设置hearder头
    options = webdriver.ChromeOptions()
    user_ag = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 " \
              "Safari/537.36 "
    options.add_argument('user-agent=%s' % user_ag)
    driver = webdriver.Chrome(executable_path="chromedriver", options=options)

注入JS反反爬

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })

Selenium打开网站的方法为.get("url")

    driver.get(
        "https://login.taobao.com/member/login.jhtml?spm=a21bo.21814703.754894437.1.5af911d9tBuTtn&f=top&redirectURL"
        "=https%3A%2F%2Fwww.taobao.com%2F")

等待浏览器打开页面调用login2()进行登陆 *** 作

扫码登陆成功进入购物车

# 登录后跳转购物车
    driver.get('https://cart.taobao.com/')

找到当前界面全选按钮的HTML代码,定位该元素(方法有很多这里使用的是XPATH方法定位)

if driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]'):
    driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()
    print("全选商品")
    time.sleep(2)

全选之后点击结算按钮。

if driver.find_element(By.XPATH, '//*[@id="J_Go"]/span'):
    print("点击结算按钮")
    driver.find_element(By.XPATH, '//*[@id="J_Go"]/span').click()

提交订单

if driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]'):
    print("提交订单")
    driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]').click()

大家可以试一下用其他定位方法尝试一下,还是很简单的。

下面是完整的代码:

from datetime import datetime

from selenium import webdriver
import time
import json

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


# 方法一,密码登录
def login1():
    driver.find_element(By.XPATH, '//*[@id="fm-login-id"]').send_keys('15097922996')
    driver.find_element(By.XPATH, '//*[@id="fm-login-password"]').send_keys('sr1317ba1')
    driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]/button').click()
    try:
        # 找到滑块
        slider = driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')
        # 判断滑块是否可见
        if slider.is_displayed():
            # 点击并且不松开鼠标
            ActionChains(driver).click_and_hold(on_element=slider).perform()
            # 往右边移动258个位置
            ActionChains(driver).move_by_offset(xoffset=258, yoffset=0).perform()
            # 松开鼠标
            ActionChains(driver).pause(0.5).release().perform()
    except:
        time.sleep(7)


# 方法二,二维码登录(最稳定)
def login2():
    driver.find_element(By.XPATH, '//*[@id="login"]/div[1]/i').click()

    # 扫码登陆
    print('扫码')
    # 设置等待时间
    time.sleep(10)
    print('即将开始')
    # driver.find_element(By.XPATH, '//*[@id="login-form"]/div[4]').click()
    time.sleep(3)


if __name__ == '__main__':
    # 抢购时间设置
    # 获取电脑现在的时间,                      year month day
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
    times = f'{now[:8]}{input("日:")} {input("时:")}:{input("分:")}:{input("秒:")}.000000'

    options = webdriver.ChromeOptions()
    user_ag = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 " \
              "Safari/537.36 "
    options.add_argument('user-agent=%s' % user_ag)
    driver = webdriver.Chrome(executable_path="chromedriver", options=options)
    # 注入js代码反反爬
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    # 打开淘宝登录页面

    # 窗口最大化
    driver.maximize_window()

    # 登录
    login1()
    time.sleep(1)

    # 登录后跳转购物车
    driver.get('https://cart.taobao.com/')
    not_already = True
    while not_already:
        try:
            print('等待抢购时间到达')
            # 脚本注入当前页面
            sreach_window = driver.window_handles
            driver.switch_to.window(sreach_window[-1])

            # 获取电脑现在的时间,                      year month day
            now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
            # 对比时间,时间到的话就点击结算
            print(now)
            print('抢购时间:\n', times)
            # 判断是不是到了秒杀时间?
            if now > times:

                # 刷新界面全选购物车
                while True:
                    try:
                        # driver.refresh()
                        if driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]'):
                            driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()
                            # driver.find_element(By.XPATH, '//*[@id="J_SelectAll2"]').click()
                            print("全选商品")
                            time.sleep(2)
                            break
                    except Exception as e:
                        print(e)
                        print('全选失败')
                        # driver.close()
                    time.sleep(0.01)
                while True:
                    try:
                        # print("点击结算按钮")
                        
                            break
                    except Exception as e:
                        print(e)
                        print("结算失败")
                        # driver.close()
                        pass
                    time.sleep(0.01)
                while True:
                    try:
                        sreach_window = driver.window_handles
                        time.sleep(1)
                        driver.switch_to.window(sreach_window[-1])
                        if driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]'):
                            print("提交订单")
                            driver.find_element(By.XPATH, '//*[@id="submitOrderPC_1"]/div[1]/a[2]').click()
                            print('over')
                            not_already = False
                            time.sleep(3)
                            break
                    except Exception as e:
                        print(e)
                        print("提交订单失败")
                        # driver.close()
                        pass
                    time.sleep(0.01)
        except:
            pass
    time.sleep(0.01)

    driver.close()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存