1.参考

利用 Python + Selenium 自动化快速截图

利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

使用python获取系统所有进程PID以及进程名称

python锁定焦点到指定进程窗口的参考方法

2.改进js代码,下拉和上拉,精确判断加载是否结束

#!/usr/bin/env python
# -*- coding: UTF-8 -*
import time from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.action_chains import ActionChains def scroll_page(url, browser='chrome'):
if browser=='chrome':
driver = webdriver.Chrome()
else:
driver = webdriver.Firefox() #右键异常 ActionChains(driver).context_click(e).perform()
# driver = webdriver.PhantomJS() #可截长图!可是加载长网页时间超长?
driver.set_window_size(1200, 900)
driver.get(url) # Load page
start = time.time() print driver.title
driver.execute_script("""
(function () {
var y = 0;
var step = 1000; //100
window.scroll(0, 0); function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100); //100 递归循环调用
}
else {
if(document.title.indexOf("scroll-done") < 0){ //-1 找不到,还没执行下文的driver.execute_script
y -= step;
window.scroll(0, y);
setTimeout(f, 100); //100
//window.scroll(0, 0);
//document.title += "scroll-done";
}
//else{
//window.scroll(0, 0);
//}
}
} setTimeout(f, 1000); //1000
})();
""")
#拉到最后 出现元素“没有更多了”
WebDriverWait(driver, 500).until(lambda x: x.find_element_by_xpath('//div[@style="text-align:center"]/em')) #或者引发 TimeoutException #停止上面的js到终点再上拉 循环
driver.execute_script("""
(function () { function f() {
document.title += " scroll-done";
} setTimeout(f, 1000);
})();
""")
# <div class="js-infinite-layout">
# <div class="js-infinite-item">
# Jetbrains公司正式发布Pycharm 5
rst = driver.find_element_by_xpath('//div[@class="js-infinite-item"][last()]//div[@class="header"]').text #不能在path内部写入 text()
print rst
if rst != u'Jetbrains公司正式发布Pycharm 5':
raise RuntimeError('wrong!!!')
print time.time()-start
print driver.title
# time.sleep(3) #执行js也需要时间
WebDriverWait(driver, 10).until(lambda x: x.title == u'编程派 | Coding Python scroll-done') #或者引发 TimeoutException
print driver.title
return driver

3.通过pid进程号和窗口标题定位窗口并前置

import win32con
import win32gui
import win32process
import psutil def get_hwnds_for_pid (pid):
def callback (hwnd, hwnds):
if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
hwnds.append(hwnd)
return True
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds def set_process_foreground(pid_part_name, pid_window_text):
pids_target = []
for pid in psutil.pids():
p = psutil.Process(pid)
if pid_part_name in p.name().lower(): #'chrome.exe' 'EXCEL.EXE'
pids_target.append(pid) for pid in pids_target:
for hwnd in get_hwnds_for_pid(pid):
# 92292 chrome.exe 137328 编程派 | Coding Python - Google Chrome
# EXCEL.EXE 857830 Microsoft Excel - Book1.xlsx
# 90644 firefox.exe 595556 编程派 | Coding Python scroll-done - Mozilla Firefox if pid_window_text.encode('gbk') in win32gui.GetWindowText(hwnd):
print pid, psutil.Process(pid).name(), hwnd, win32gui.GetWindowText(hwnd)
win32gui.SetForegroundWindow(hwnd)
return
raise RuntimeError('process not found')

4.通过autopy实现右键操作,以及网页另存为

from autopy import key, mouse
def save_result(driver):
time_for_filename = time.strftime('%H%M%S')
with open('%s.html'%time_for_filename,'wb') as f:
f.write(driver.page_source.encode('utf-8')) # e = driver.find_element_by_xpath('//img[@src="/static/images/logo.png"]')
# ActionChains(driver).context_click(e).perform()
# time.sleep(1.5)
# esc 退出右键菜单
# key.tap(key.K_ESCAPE)
# driver.set_window_position(0,0)
# window_position = driver.get_window_position() # {u'x': 10, u'y': 10}
# mouse.move(int(window_position['x']+150), int(window_position['y']+150))
#右键再左键 避免错误点开链接
# mouse.click(mouse.RIGHT_BUTTON)
# mouse.click(mouse.LEFT_BUTTON) # 关键是浏览器位于foreground
set_process_foreground(driver.name,driver.title)
key.tap('s', key.MOD_CONTROL)
time.sleep(1.5)
key.type_string(time_for_filename)
time.sleep(0.5)
key.tap(key.K_RETURN) driver.save_screenshot('%s.png'%time_for_filename)
# driver.close() if __name__ == "__main__":
browser = 'chrome'
# browser = 'firefox'
url = "http://codingpy.com"
driver = scroll_page(url,browser)
save_result(driver)
print 'All DONE'

python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作的更多相关文章

  1. JS控制滚动条的位置

    转载▼http://blog.sina.com.cn/s/blog_4481a3460100rwwu.html     JS控制滚动条的位置:window.scrollTo(x,y); 竖向滚动条置顶 ...

  2. python+selenium+js 处理滚动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  3. Selenium3+python自动化 -JS处理滚动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  4. js控制滚动条的位置以及隐藏滚动条

    document.documentElement.style.overflow = 'hidden'; //隐藏横竖滚动条 window.scrollTo(0,document.body.scroll ...

  5. python 写了一个批量拉取文件进excel文档

    路径如: C:\\Users\\huaqi\\Desktop\\信息收集 “信息收集”目录下有以下子目录:[技术,客服,运营,行政] “技术”目录下有以下子文件:[小白.txt,小红.txt,小黑.t ...

  6. 《selenium2 python 自动化测试实战》(15)——调用js控制滚动条等操作

    看代码: # coding=utf-8 from time import sleepfrom selenium import webdriver driver = webdriver.Firefox( ...

  7. 爬虫实例——通过JS控制滚动条

    案例 某位淘女郎的某个相册 有能力的童鞋可以先尝试一下爬取每张照片的链接. 我曾经尝试过几种方法,下面一一介绍: 第一种方法,采用requests和BeautifulSoup: import requ ...

  8. Js控制滚动条

    1>全局控制 //向上滑动显示 var initTop = 0; var i = 1; $(window).scroll(function(){ var scrollTop = $(docume ...

  9. js控制滚动条默认在底部

    html: <div id="chat_content" class="chat_content">                    < ...

随机推荐

  1. ubuntu only enable left click

    xmodmap -e "pointer = 1 0 0 0 0 0 0 0 0 0"

  2. js基础-字符串常用属性合集

    /*   *   * 实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法   * 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调 ...

  3. java编译过程(字节码编译和即时编译)

    Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...

  4. BZOJ 3456: 城市规划 与 多项式求逆算法介绍(多项式求逆, dp)

    题面 求有 \(n\) 个点的无向有标号连通图个数 . \((1 \le n \le 1.3 * 10^5)\) 题解 首先考虑 dp ... 直接算可行的方案数 , 容易算重复 . 我们用总方案数减 ...

  5. jmeter5.1在windows(含插件安装)及linux环境下安装

    jmeter下载 前提:已经安装jdk8+ jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi 有Binaries和Source版本 前者是 ...

  6. scrapy之使用LinkExtractor提取链接

    一.概述: 在页面含有少量链接时,使用selector来提取信息就可以,但如果链接特别多时,就需要用LinkExtractor来提取. 二.LinkExtractor构造器的各个参数: 1.allow ...

  7. Vue笔记:使用 axios 中 this 指向问题

    问题背景 在vue中使用axios做网络请求的时候,会遇到this不指向vue,而为undefined. 如下图所示,我们有一个 login 方法,希望在登录成功之后路由到主页,但通过 this.$r ...

  8. react-native命令行打包APK报错

    我是根据react-native官网进行的react-native打包APK 我的步骤为 第一步就是生成密钥 第二步就是将密钥拷入 第三步:在\android\gradle.properties写入 ...

  9. vue---slot,slot-scoped,以及2.6版本之后插槽的用法

    slot 插槽 ,是用在组件中,向组件分发内容.它的内容可以包含任何模板代码,包括HTML. vue 在 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令).它取 ...

  10. 神经网络3_M-P模型

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程,QQ:231469242) https://study.163.com/course/introduction.htm?courseId ...