分享

用Python Selenium完成Chrome的自动化操作详解

 excel05 2022-07-01 发布于福建

由于 PhantomJS 已经不会再更新,所以基于模拟器爬虫应该使用浏览器应该是 Chrome 或者 Firefox。

配合Python + Selenium + Chrome(FireFox ),尝试获取元素、点击、等待、整页截图等 UI 操作。

需要注意的是不管是 Chrome 还是 Firefox,他们都有通用的地方,也有各自特定的部分,需要掌握查看对应浏览器 API 的方法才能完全掌握。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

文章图片1

开发环境

  • Windows 10 专业版 (64bit)
  • Chrome 102.0.5005.61
  • ChromeDriver 102.0.5005.61
  • Python 3.5.6
  • selenium 3.141.0

三方包安装。

pip install selenium

在 Selenium 和 浏览器(Chrome、FireFox)之间,需要一个 WebDriver 驱动(ChromeDriver、FireFoxDriver)。

安装 ChromeDriver 驱动

从 chromedriver 驱动 下载与操作系统匹配的 ChromeDriver 驱动。

文章图片2

安装 FireFox 驱动

从 FireFox 驱动 下载与操作系统匹配的 ChromeDriver 驱动。

文章图片3

浏览器指定环境变量

谷歌浏览器驱动环境指定。

chrome=R'xxxxx/WebDrivers/chromedriver_win32/chromedriver.exe'
文章图片4

火狐浏览器驱动环境指定。

geckodriver 压缩包解压后将 geckodriver.exe 复制到火狐浏览器目录下。

文章图片5

使用注意事项

Python+Selenium 是一种用于自动 Web 测试和抓取的技术。尤其是在抓取时,需要考虑数据版权问题、服务器负载、各种规则(会员登录时的会员规则等)。

例如 京东、淘宝 等使用条款可能明确禁止抓取,或者 robots.txt 可能禁止抓取。

使用测试

非无头模式测试

运行 ChromeDriver 官方网站上的 Getting Started 中的示例代码 。

Chrome 将启动,5 秒后将使用 ChromeDriver 执行 百度搜索。(Chrome 窗口显示Chrome 由自动化测试软件控制。)再过 5 秒会自动关闭。

import timefrom selenium import webdriverdriver = webdriver.Chrome(chrome)driver.get('https://www.baidu.com/')time.sleep(5)search_box = driver.find_element_by_name('wd')search_box.send_keys('ChromeDriver')search_box.submit()time.sleep(5)driver.quit()

无头模式测试

通过 options 配置在浏览网页时不弹出浏览器操作。

from selenium import webdriver# 增加无头配置options = webdriver.ChromeOptions()options.add_argument('--headless')options.add_argument('--disable-gpu')driver = webdriver.Chrome(chrome,options=options) driver.get('https://www.baidu.com/')print(driver.title)search_box = driver.find_element_by_name('wd')search_box.send_keys('ChromeDriver')search_box.submit()print(driver.title)driver.save_screenshot('search_results.png')driver.quit()百度一下,你就知道百度一下,你就知道
文章图片6

获取元素

页面中的元素可以通过ID、类名、标签名、链接的innerText、CSS选择器、XPath来获取。

加载和使用浏览器驱动配置信息。

import warningswarnings.filterwarnings('ignore')import timefrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.chrome.options import Optionschrome=R'xxxxx/WebDrivers/chromedriver_win32/chromedriver.exe'driver = webdriver.Chrome(chrome) driver.get('https://www.baidu.com/')

CSS 选择器

可以使用 .text 来检索
find_elements_by_css_selector 值提取的列表的具体值。

for span in driver.find_elements_by_css_selector('span'):    print(span.text)换一换......热4汤唯无缘戛纳电影节最佳女演员新2皇马1-0利物浦 第14次夺欧冠冠军热5下周端午放假3天......

Link Text 选择器

使用 link text 选择器定位包含字符的链接框,其中字符必须完全匹配。

for a in driver.find_elements_by_link_text('京公网安备11000002000001号'): print(a.get_attribute('href'))http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001

Partial Link Text 选择器

使用 link text 选择器定位包含字符的链接框,其中字符可以部分匹配。

for a in driver.find_elements_by_partial_link_text('京公网安备'):    print(a.get_attribute('href'))http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001

基于搜索框进行定位的多种方法。

文章图片7

ID 选择器

使用 id 选择器定位搜索框。

driver.find_elements_by_id('kw')[<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>]

Class Name 选择器

使用 class name 选择器定位搜索框。

driver.find_elements_by_class_name('s_ipt')[<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>]

Tag Name 选择器

使用 tag name 选择器定位搜索框。

driver.find_element_by_tag_name('input')<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='e848177c-372f-46d7-93f4-0579a9bbfeb8')>

Name 选择器

使用 name 选择器定位搜索框。

driver.find_element_by_name('wd')<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>

XPath 选择器

使用 name 选择器定位搜索框。这个功能最简单,使用浏览器自带的搜索功能即可。

文章图片8
driver.find_elements_by_xpath('//*[@id='kw']')[<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>]

也可以进行关键信息的定位查找。

for a in driver.find_elements_by_xpath('//a[text()='京公网安备11000002000001号']'):    print(a.get_attribute('href'))http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001for a in driver.find_elements_by_xpath('//a[contains(text(), '京公网安备')]'):    print(a.get_attribute('href'))http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001

检查元素的状态

可以使用以下方法检查找到的元素的状态。

  • element.is_displayed()
  • element.is_enabled()
  • element.is_selected()
text_field.is_displayed() # 判断元素是否显示driver.find_element_by_name('xxx').is_enabled() # 判断button是否显示driver.find_element_by_class_name('btn').is_enabled()driver.find_element_by_class_name('btn').is_selected() # 判断button是否被选中

用户操作

定位选择

上面已经介绍了通过 id、class name、tag name 、name 以及 xpath 定位搜索框。

文章图片9

信息输入 input

用于在文本字段或文本区域中输入字符串send_keys()。

from selenium.webdriver.common.keys import Keyelement.send_keys('文字')element.send_keys(Keys.RETURN) # 特殊键输入等。element.send_keys('文字', Keys.RETURN) # (连续书写时)element.clear() # 清除(send_keys放在前面以防万一)driver.find_elements_by_xpath('//*[@id='kw']')[0].send_keys('百度搜索')
文章图片10

点击 click

使用 .click() 可以单击检索到的元素。

driver.find_elements_by_xpath('//*[@id='su']')[0].click()
文章图片11

提交 submit

功能相同于 driver.find_element_by_id('submit').click() 单击提交按钮等。

driver.find_element_by_id('su').click()
文章图片12

鼠标悬停动作

将鼠标悬停到指定的位置。

from selenium.webdriver.common.action_chains import ActionChainsactions = ActionChains(driver)actions.move_to_element( driver.find_element_by_class_name('c-gap-top-small')).perform()

鼠标拖放

此功能用于页面内功能模块的拖动。

src = driver.find_element_by_name('xxx1') # 起始位置tgt = driver.find_element_by_name('xxx2') # 目标位置actions.drag_and_drop(src, tgt).perform()

页面和窗口间移动

页面间移动

driver.get(URL) # 打开指定页面driver.forward() # 页面前进driver.back() # 页面后退driver.refresh() # 浏览器刷新

移动到 window 或 frame

# 获取窗口句柄windowName= driver.window_handlesdriver.switch_to.window(windowName[-1]) # 移动到最后一个窗口# 定位frame窗口driver.switch_to.frame(frameName)

响应弹出对话框

访问弹出的对话框。

driver.switch_to_alert()

浏览器等待

某些页面操作需要等待检查元素的存在和状态。

明确指定条件

使用 expected_conditions 方法实现。

from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 要修复超时时间wait = WebDriverWait(driver, 10)  # 超时 10 秒(最长等待时间)# 示例 1:等待所有加载并显示包含的标题driver.get('https://www.baidu.com')wait.until(EC.title_contains('Baidu'))True# 示例2:单击然后等待 innerText 中带有 xxxx 且类属性为 xxxx 的元素出现。driver.find_elements_by_xpath('//*[@id='su']')[0].click()wait.until(    EC.text_to_be_present_in_element((By.CLASS_NAME, 'xxxx'), '百度'))

隐式等待时间

如果无法立即找到元素,则指定等待时间(轮询时间),默认值为 0。

driver.implicitly_wait(秒数)

指定等待时间

使用 time.sleep(秒数) 的方法,以免服务器超载。

浏览器屏幕操作

调整大小和滚动条。并且使用 driver.execute_script(...) 可以运行 JavaScript 相关功能。

driver.set_window_size(1920, 1080)driver.maximize_window()  # 最大化时(在无头模式下不起作用)driver.execute_script('window.scrollTo(0, 600);')  # 滚动条driver.save_screenshot('screenshot.png') # 截图1driver.get_screenshot_as_file('screenshot.png')  # 截图2

调整浏览器窗口大小

从 options 配置浏览器窗口大小。

options.add_argument('--window-size=800,600')options.add_argument('--start-maximized') # 最大化显示options.add_argument('--start-fullscreen') # 全屏幕显示

隐藏滚动条

driver.execute_script('document.body.style.overflow = 'hidden';')

截图操作

在无头模式下,截取整个搜索结果页面的屏幕截图。

import warningswarnings.filterwarnings('ignore')import timefrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.chrome.options import Optionschrome=R'xxxxx/WebDrivers/chromedriver_win32/chromedriver.exe'driver = webdriver.Chrome(chrome,options=options) driver.get('https://www.baidu.com/')driver.find_element_by_name('wd').send_keys('python', Keys.RETURN)width = driver.execute_script('return document.body.scrollWidth;')height = driver.execute_script('return document.body.scrollHeight;')driver.set_window_size(width, height)driver.save_screenshot('screenshot-full.png')True
文章图片13

浏览器的关闭与退出

关闭当前焦点所在的浏览器窗口。

driver.close() 

关闭所有浏览器窗口并终止其 WebDriver 会话。

driver.quit()

浏览器 cookie

获得 cookie 。

driver.get_cookies()

追加 cookie 。

driver.add_cookie({'name':'key', 'value':'value'})

删除 cookie 。

driver.delete_cookie('CookieName')driver.delete_all_cookies()

浏览器代理

ids=['xxx.xxx.xxx.xxx:xxxx']opt = webdriver.ChromeOptions()opt.add_argument('--proxy-server=http://{}'.format(id)) # 添加代理

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多