Selenium自动化发布话题(Python实现)

栏目: Python · 发布时间: 5年前

内容简介:折腾了一下自动化测试,找到了阿里开源的一个 uirecorder ,可以自动录制测试过程,但自定义逻辑有些麻烦然后发现这货是基于 selenium 实现的,于是就开始折腾起了 selenium,弄出了个小成果,记录一下并分享给有需要的人老规矩,先上图

折腾了一下自动化测试,找到了阿里开源的一个 uirecorder ,可以自动录制测试过程,但自定义逻辑有些麻烦

然后发现这货是基于 selenium 实现的,于是就开始折腾起了 selenium,弄出了个小成果,记录一下并分享给有需要的人

老规矩,先上图

安装

pip install selenium

打开浏览器

先下载 chromedriver 下载地址: http://chromedriver.chromium.org/

下载好后解压,创建一个文件夹,名为: selenium-dmeo 你也可以命名成其它名字,将 chromedriver拷贝进去,然后创建一个py文件,我这里命名为 main.py

from selenium import webdriver

if __name__ == "__main__":
    browser = webdriver.Chrome("./chromedriver")
    browser.set_window_size(1024, 768)

    browser.get('https://demo.yiiu.co/')

    browser.quit()

这样就可以打开一个浏览器,然后在浏览器里打开网址:https://demo.yiiu.co/

获取元素并触发点击事件

selenium里获取元素的方法有很多个,如下

Selenium自动化发布话题(Python实现)

我这里主要使用两个方法 find_element_by_id find_element_by_xpath

为啥要用这两个方法呢? find_element_by_id 不用说,可以根据id获取唯一的元素,很准确,至于 find_element_by_xpath 是因为chrome浏览器里在审查元素里可以 copy Xpath 也很方便

获取到元素肯定要点击了,点击方法也很好实现,如下

from selenium.webdriver.common.keys import Keys
.send_keys(Keys.ENTER)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

if __name__ == "__main__":
    browser = webdriver.Chrome("./chromedriver")
    browser.set_window_size(1024, 768)

    browser.get('https://demo.yiiu.co/')

    # 等待Body标签加载出来
    WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5)\
        .until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    # 通过xpath路径获取到登录A标签然后点击
    browser.find_element_by_xpath('//*[@id="bs-example-navbar-collapse-1"]/ul[2]/li[2]/a')\
        .send_keys(Keys.ENTER)

获取到元素就可以取元素上的值了,比如一个A标签的文本和链接,如下

topicAElement = browser.find_element_by_xpath('/html/body/div/div/div/div[1]/div/div[2]/div[1]/div[2]/div/a')
text = topicAElement.get_attribute('text')
href = topicAElement.get_attribute('href')
print(text, href)
browser.quit()

# 打印结果
# 第一篇话题 https://demo.yiiu.co/topic/51

操作form表单

上一步可以获取到元素的对象了,也可以获取到元素上的信息了,那怎么给元素设置值呢,比如往表单里设置自定义的值

还是使用 .send_keys() 方法,用法如下

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

if __name__ == "__main__":
    browser = webdriver.Chrome("./chromedriver")
    browser.set_window_size(1024, 768)

    browser.get('https://demo.yiiu.co/')

    # 等待Body标签加载出来
    WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5)\
        .until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    browser.find_element_by_xpath('//*[@id="bs-example-navbar-collapse-1"]/ul[2]/li[2]/a')\
        .send_keys(Keys.ENTER)
    time.sleep(.5)
    # 等待Body标签加载出来
    WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5) \
        .until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    # 设置登录用户名
    browser.find_element_by_id('username').send_keys("tomoya92")
    time.sleep(.5)
    # 设置登录密码
    browser.find_element_by_id('password').send_keys("aa123123")
    time.sleep(.5)
    # 点击登录按钮
    browser.find_element_by_id('login_btn').send_keys(Keys.ENTER)
    time.sleep(2)
    browser.quit()

等待页面加载

等待页面加载的方法网上有很多文章介绍,我觉得直接等待下一步要操作的元素加载出来后,就可以操作了,这个比较实用,下面就介绍一下这个用法

导入依赖

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

用法

WebDriverWait(driver=browser, timeout=30, poll_frequency=0.5) \
        .until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

说明:

WebDriverWait() 方法的参数

browser = webdriver.Chrome("./chromedriver")

until() 方法参数里的 presence_of_element_located() 方法里的参数是一个元组,不要写错了,外面是有一层 () 的,元组里也有多种判断写法,可以通过TAG_NAME, XPATH, CSS_SELECTOR等判断

另外就是系统提供的time库用来在两种操作中间等待一下,比如上面填写登录用户名和密码之间就睡眠了0.5s,这样可以方便调试 time.sleep(.5)

鼠标点击事件

有些输入框,比如上面打开的网站里发布话题的内容输入框,用的就是 codemirror ,直接找到 textarea 的id填值是没有效果的,这时候鼠标操作就派上用场了

首先还是导入依赖 from selenium.webdriver.common.action_chains import ActionChains

用法如下

# 内容输入框使用的是codeMirror,这里再使用简单的获取textarea的id然后sendKeys是不行的,所以这里使用了鼠标点击事件来输入数据
contentElement = browser.find_element_by_xpath('//*[@id="form"]/div[2]/div/div[6]')
# 链式调用,最后通过 `perform()` 方法来触发依次执行前面定义好的执行过程
ActionChains(driver=browser).click(contentElement).send_keys("hello world").perform()

扩展

通过 selenium 可以自定义对网站操作的动作,这利用空间的太大了,网站防爬也就更难了,项目上线之间也可以通过自己编写脚本跑一遍,防止一些错误出现

另外还可以结合数据库或者Excel等实现自动化发帖,爬取网站数据等操作,即使是JS渲染的网站也不怕了,是不是很爽

原文链接:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

与孩子一起学编程

与孩子一起学编程

[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元

一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具