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

时间:2022-09-05 21:31:27

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&plus;selenium&plus;js 处理滚动条

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

  3. Selenium3&plus;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. 四、Shell输入、输出功能和字符颜色设置

    一.Shell输入功能 1.键盘输入   方式一: [root@Salve four]# cat test.sh #!/bin/bash #-e 参数可以解析语句中的转义字符 echo -e &quo ...

  2. XMLCDataSection

    XmlCDataSection类描述XML数据中的CDATA节.CDATA节在XML数据中的作用是为文本内容定义引号和转义符,即XML解析器不解析CDATA中的任何字符. XmlCDataSectio ...

  3. 标准库 - unicode&sol;utf8&sol;utf8&period;go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  4. tp中让头疼似懂非懂的create

    项目中多次用到create() 只能它是表单验证,不过好出错,痛下心扉好好了解理解它的来龙去脉和所用的用法 一:通过create() 方法或者 赋值的方法生成数据对象,然后写入数据库 $model = ...

  5. C&num; Winform 界面线程的Invoke死锁,以及Application&period;DoEvent的问题

    1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...

  6. OCP-1Z0-051-题目解析-第1题

    1. View the Exhibit and examine the structure of the SALES, CUSTOMERS, PRODUCTS, and TIMES tables. T ...

  7. adb 卸载android系统程序

    下面是通过 pm list packages -f 列出手机中的软件,然后跟模拟器中的软件进行对比后得出的可以安全卸载的列表.   注意:卸载之后就没有Google Market了,还想用google ...

  8. Java学习笔记之接口和抽象类

    接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...

  9. 菜鸟学IT之python词云初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 1. 下载一长篇中文小说. 2. 从文件读取待分析文本. txt = ...

  10. Android测试技能树

    Android 基础知识 Android 的体系结构 apk 的组成结构 adb 命令的使用 Android 的四大组件 Activity 的生命周期 … 测试/开发环境的准备 JDK 安装 SDK ...