python中selenium使用入门1

序言

各位大佬,本人为完全零基础的新人一枚,最近在新学习爬虫,回顾来到这的三个多月时间,一点一滴,一分一秒都不是那么轻松容易,但是我相信我的选择是正确的,本博文完全是为了记笔记自用,有些啰嗦,敬请见谅,同时记录的有什么问题也希望各位大佬高抬贵手给予指出,感谢!!!!!!!
本次为使用自动化测试工具selenium模拟人操作来对数据进行爬取,当然selenium使用方法很多,今天暂时先通过模拟账号登录来初步认识selenium的基础使用:

1.selenium的简介与安装

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google,Chrome,Opera,Edge等。
Selenium需要驱动程序与所选浏览器进行交互,首先进入自己的浏览器(以Chrome为例),点击左上角三个点找到设置,进入设置页面,然后点击“关于Chrome”找到版本号,根据对应版本号去下方对应浏览器网址中找到对应版本号的程序下载。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

- Chrome: http://chromedriver.storage.googleapis.com/index.html
- Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Firefox: https://github.com/mozilla/geckodriver/releases
- Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

最后,将下载的应用程序放在Chrome或python源目录下,并在计算机高级设置中设置chromedriver的环境变量,并在使用pip将selenium库安装,然后使用以下代码进行测试:

import time
from selenium import webdriver

url = 'https://www.baidu.com'
div = webdriver.Chrome()
div.get(url)
time.sleep(10)

如果出现以下页面,代表selenium安装成功。
在这里插入图片描述

2.selenium的初步使用

现在可以使用python对浏览器进行初步操作,今天先暂时使用一个登录页面(https://passport.17k.com/login/)来对表单填写及按钮点击进行初步使用。
代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time

url = 'https://passport.17k.com/login/'
#构建对象
div = webdriver.Chrome()
#打开浏览器链接
div.get(url)
#获取元素所在位置(xpath方式)
name = div.find_element(By.XPATH,'/html/body/form/dl/dd[2]/input')#登录账号
password = div.find_element(By.XPATH,'/html/body/form/dl/dd[3]/input')#登录密码
read = div.find_element(By.XPATH,'//*[@id="protocol"]')#用户协议同意框
login = div.find_element(By.XPATH,'/html/body/form/dl/dd[5]/input')#登录按钮
#填入表单及点击登录
name.send_keys('123456')#填入账号
time.sleep(3)
password.send_keys('125789')#填入密码
time.sleep(3)
read.click()#点击同意框
time.sleep(3)
login.click()#点击登录
time.sleep(10)

xpath的查找地址获取更加简单,如登录账号输入框位置的查找:先进入审查元素,找到登录账号输入框位置右键,

在这里插入图片描述
然后找到复制—复制XPATH(/html/body/form/dl/dd[2]/input)就会将查找的地址定位给出,将其复制到代码(div.find_element(By.XPATH,‘/html/body/form/dl/dd[2]/input’))中即可。

3.改进

但这种方式会有一个问题,就是如果网页还没有加载完成,代码任会执行造成报错,所以我们需要等待加载完毕之后再操作。代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common import TimeoutException#导入超时异常
from selenium.webdriver.support.ui import WebDriverWait#导入等待模块
from selenium.webdriver.support import expected_conditions as re
import time

url = 'https://passport.17k.com/login/'
div = webdriver.Chrome()
#构建对象
div.get(url)
#打开浏览器并执行等待(最多10秒)
div1 = WebDriverWait(div , 10)

def run():
    try:
    	#获取位置
        name = div1.until(re.presence_of_element_located((By.XPATH , '/html/body/form/dl/dd[2]/input')))
        password = div1.until(re.presence_of_element_located((By.XPATH, '/html/body/form/dl/dd[3]/input')))
        read = div1.until(re.presence_of_element_located((By.XPATH, '//*[@id="protocol"]')))
        login = div1.until(re.presence_of_element_located((By.XPATH, '/html/body/form/dl/dd[5]/input')))
        #填入操作
        name.send_keys('123456')
        password.send_keys('125789')
        read.click()
        login.click()
        time.sleep(10)
    #如果超时捕获异常
    except TimeoutException:
    	结束本次函数执行并重新调用本函数
        return run()


if __name__ == '__main__':
    run()

这种方式用于等待特定条件发生,然后再继续执行代码。这种情况的极端情况是 time.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法来帮助您编写只等待所需时间的代码。WebDriverWait 与 ExpectedCondition 结合使用是实现此目的的一种方式。在上面的代码中,Selenium 将等待最多 10 秒以找到匹配给定条件的元素。如果在那段时间内没有找到任何元素,则抛出 TimeoutException。捕获到异常后写一个递归操作,这样10秒之后就会继续等待10秒,知道元素加载完毕。

4.结语

selenium是一个很强大的工具,比如鼠标拖拽等,以下是上面没有用到的一些操作方式:

# 窗口最大化
driver.maximize_window()

# 获取页面源代码
driver.page_source

# 获取所有cookie
driver.get_cookies()

#定位
# 1、通过id值定位
driver.find_element(By.ID,"kw")

# 2、通过class值定位
driver.find_element(By.CLASS_NAME,"s_ipt")

# 3、通过name定位
driver.find_element(By.NAME,"wd")

# 4、通过tag_name定位
driver.find_element(By.TAG_NAME,"div")
# 说明:HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用;

# 5、通过XPATH语法定位
driver.find_element(By.XPATH,"//*[@id="kw"]")

# 6、通过css语法定位
driver.find_element(By.CSS,"#kw")

# 7、通过文本定位--精确定位
driver.find_element(By.LINK_TEXT,"在希望的田野上")

# 8、通过部分文本定位--模糊定位
driver.find_element(By.PARTIAL_LINK_TEXT,"田野上")

#行为链
#在用selenium操作页面时,有时要分为很多步骤,那么这个时候可以用鼠标行为链类ActionChains来完成。
from selenium import webdriver
from selenium.webdriver.common.by import By
#引入行为链ActionChains类
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
#定位搜索框
inputtag = driver.find_element(By.ID,"kw")

#百度一下按钮
submittag = driver.find_element(By.ID,"su")

#建立行为链
actions =ActionChains(driver)

#给搜索框发送数据
actions.move_to_element(inputtag)
actions.send_keys_to_element(inputtag,'python')
#选中提交按钮并提交
actions.move_to_element(submittag)
actions.click(submittag)
#统一执行
actions.perform()

#动作链
#ActionChains方法列表
#click(on_element=None) ——单击鼠标左键
#click_and_hold(on_element=None) ——点击鼠标左键,不松开
#context_click(on_element=None) ——点击鼠标右键
#double_click(on_element=None) ——双击鼠标左键
#drag_and_drop(source, target) ——拖拽到某个元素然后松开
#key_down(value, element=None) ——按下某个键盘上的键
#key_up(value, element=None) ——松开某个键
#move_to_element(to_element) ——鼠标移动到某个元素
#perform() ——执行链中的所有动作
#release(on_element=None) ——在某个元素位置松开鼠标左键
#send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
#send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
#动作链示例
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm')

# 鼠标移动到此元素,在下面的input框中会显示“Mouse moved”
write = driver.find_element(By.XPATH,'//input[@value="Write on hover"]')
# 鼠标移动到此元素,会清空下面input框中的内容
blank = driver.find_element(By.XPATH,'//input[@value="Blank on hover"]')

result = driver.find_element(By.NAME,'t1')

action = ActionChains(driver)
# 移动到write,显示“Mouse moved”
time.sleep(3)
# 移动到write上
action.move_to_element(write).perform()

# 移动到blank上,清空
time.sleep(3)
action.move_to_element(blank).perform()
# 移动到write上
time.sleep(3)
action.move_to_element(write).perform()

driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值