Py之Selenium控制浏览器

最近写了一个小项目,关于使用py程序控制浏览器并自动注入信息等
刚开始时首先想到了用requests直接post数据,但是不知道会不会有许多其他数据,后来在网上看到了selenium库
相比requests selenium的优点在于可视化并且操作简单不用进行抓包等操作
但是会对页面前端代码有一定的要求,常会出现部分元素在页面上不可见,无法定位到某元素等情况
以下作为小小总结希望有所帮助:
首先是安装selenium库
pip3 install selenium
首先控制浏览器就要先打开
如果要控制firefox就要下载geckodriver
控制chrome就要下载一个对应版本的Chromedriver放在python的Script目录下即可
打开浏览器:

driver = webdriver.Chrome()  #也可以使用Firefox
driver.get('网址链接’)

通常对浏览器的操作主要就由填写数据 和点击组成
填写数据只要找到了input元素然后send_keys就好了

查找元素

driver.find_element_by_id('id名')
driver.find_element_by_class_name('class名一个即可')
driver.find_element_by_tag_name('标签类型') #通常一个界面内相同标签很多,个人感觉这种方法不是很实用
driver.find_element_by_name('name')
driver.find_element_by_xpath('//标签类型[正则匹配]')
#还可以复合使用
driver.find_element_by_id('XXX').find_element_by_name('xxx') #在id为XXX的元素中查找name为xxx的元素

填写输入框

element = driver.find_element_by_xpath('//input[@name="phonenumber"]')
element.send_keys('要填写的内容')

点击元素

有时需要跳转页面就需要点击链接最简单的就是先find然后click,还有些勾选框和部分同意条款可以现在页面检查元素,不一定要点击小方块。

element.click()

休眠等待

有时页面会跳转这时就会加载如果没有等待很可能就会使下一条find出错这时候就需要使用等待了最简单的方法是

import time
time.sleep(5)  #等待5秒

但是这种方法就会比较浪费时间就算页面提前加载出来了还是必须等时间到了才会进行下一步所以我比较喜欢这种方法:

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

    try:
        element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.ID, "tableDetailsSelect")))
    finally:
        element = driver.find_element_by_xpath("//option[@id='optionValue']")

ID可替换为CLASS_NAME NAME LINK_TEXT(LINK_TEXT为链接文本)

这种方法会在从开始执行这一步起的20秒内距离一定间隔不断定位元素如果提前定位到元素就会执行并进行下一步,相对来说更节省时间

下拉选择

下拉选择通常思路就是根据显示的文本来确定元素并点击

from selenium.webdriver.support.select import Select

year = input()
sub_year = Select(driver.find_element_by_name('ccExpirationYear'))sub_year.select_by_visible_text(year)

这里就是先输入了一个year
然后就会在页面里寻找neme=ccExpirationYear的select再寻找这个select下显示的值为yaer的option并选择

在我写代码的时候因为是多次重复同一个页面的相同操作有几个要选择的option是第一个所以还使用了这种方法

element = driver.find_element_by_xpath("//option[@id='optionValue']")
element.click()

正因为这种思路后来我还尝试了
driver.find_elements_by_某某某
这样返回的是一个list就算只有一个元素
所以可以

element = driver.find_element_by_xpath()
element[1].click()

这个可以多配合Ctrl+F使用

隐藏元素

is_displayed()为false的元素,依然可以通过getAttribute()方法获取元素的属性.
由于webdriver spec的定义,Selenium WebDriver 只会与可见元素交互,所以获取隐藏元素的文本总是会返回空字符串。

可是,在某些情况下,我们需要获取隐藏元素的文本。这些内容可以使用element.attribute('attributeName'), 通过textContent, innerText, innerHTML等属性获取。

使用无头浏览器

无头浏览器是没有界面的浏览器,现在有PhantomJS、FireFox 和 Chorme 三种
相比常规浏览器,无头浏览器速度更快,效率也更高
并且PhantomJS()可以实现截长屏操作
但是无头浏览器也存在一些弊端
PhantomJS和Firefox都不能完成click操作
因此目前能用到搜集页面信息等方面
下面介绍一下PhantomJS和Firefox无头浏览器的配置方法
Firefox的无头浏览器使用方法如下:

options = webdriver.FirefoxOptions()
options.add_argument('-headless')
driver = webdriver.Firefox(options=options)

剩下的就和使用正常火狐一样了
但是要注意无头浏览器是不能执行点击操作的
安装PhantomJS的话
只需要到官网先下载PhantomJS.exe的压缩包,下载到本地之后解压然后把路径添加到环境变量里面,重启电脑就好了

10-21更新

写了一个selenium的脚本,完工的时候却发现了这样一个问题


找不到geckodriver

然后又检查了环境变量的script文件夹里面是有geckodriver.exe的
开始误以为geckodriver.exe会和其他的包一样打包进去或者是在代码中声明路径,其实不然
需要将 geckodriver.exe复制一份过来并不用指明路径

还有一个关于PhantomJS的问题
由于大部分用户的电脑中一般不会安装PhantomJS浏览器,所以就需要将PhantomJS的exe文件一同发送过去
但是这样没有配置环境变量,所以需要在代码中指明PhantomJS的路径代码如下

driver = webdriver.PhantomJS(executable_path='./phantomjs.exe')  
#使用的是相对路径 PhantomJS.exe只需要和打包好的脚本放在同一文件夹内就可以了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容