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. Flask上下文管理、session原理和全局g对象

    一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...

  2. php curl报错:417 - Expectation Failed

    当我在post提交的数据增加一段内容后会报错:417 - Expectation Failed. 查资料发现在使用curl做POST时,当post的数据大于1024字节时,curl并不会直接发起pos ...

  3. python代码格式

    1,函数名:不要大写,都用小写,单词之间用下划线分隔 2,注释:注释的时候#后面要带空格 3,方法与方法之间空格两行 4,使用方法时,里面的参数用  逗号和空格  隔开 5,使用方法时,里面的参数“= ...

  4. kubernetes-kubeadm自动生成的证书过期的解决方法

    拉取kubernetes的源码: git clone https://github.com/kubernetes/kubernetes.git 切换版本: cd kubernetes &&am ...

  5. java querydsl使用

    1  POM文件 <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apa ...

  6. Android 6.0以上动态获取权限

    首先在清单文件中注册 然后在MainActivity.java中将权限封装到一个String数组中 static final String[] PERMISSION = new String[]{ M ...

  7. re 模块 分组特别说明

    关于分组优先以及 " | " 的细致练习 from django.test import TestCase import re # Create your tests here. ...

  8. python之路day06--python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码

    python2#print() print'abc'#range() xrange()生成器#raw_input() python3# print('abc')# range()# input() = ...

  9. Mock7 moco框架重定向

    新建一个startupWithRedirect.json [ { "description": "重定向到百度", "request": { ...

  10. python实现加密

    1.md5加密 hashlib 库中包括如SHA1.SHA224.SHA256.SHA384.SHA512和MD5算法等 >>> import hashlib>>> ...