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只需要和打包好的脚本放在同一文件夹内就可以了

你可能感兴趣的:(Py之Selenium控制浏览器)