通过 Selenium 提供的 ActionChains
类来实现
from selenium import webdriver
driver = webdriver.Chrome(r'f:\chromedriver.exe')
driver.implicitly_wait(5)
driver.get('https://www.baidu.com/')
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(driver)
# 鼠标移动到 元素上
ac.move_to_element( driver.find_element_by_css_selector('[name="tj_briicon"]') ).perform()
或者代码:
element = bro.find_element_by_xpath('//*/div[@class="ui-page"]/a[@clstag="shangpin|keycount|product|pinglunfanye-nextpage"]') webdriver.ActionChains(bro).move_to_element(element).click(element).perform()
# 直接执行 javascript,里面可以直接用return返回我们需要的数据
nextPageButtonDisabled = driver.execute_script( ''' ele = document.querySelector('.soupager > button:last-of-type'); return ele.getAttribute('disabled') ''')
# 返回的数据转化为Python中的数据对象进行后续处理
if nextPageButtonDisabled == 'disabled': # 是最后一页
return True
else: # 不是最后一页
return False
在 开发者工具栏 console 里面执行如下js代码
setTimeout(function(){debugger}, 5000)
表示在 5000毫秒后,执行 debugger 命令,执行该命令会 浏览器会进入debug状态。 debug状态有个特性, 界面被冻住, 不管我们怎么点击界面都不会触发事件。
三种类型: Alert(警告信息)、confirm(确认信息)和prompt(提示输入)
Alert(警告信息)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://cdn1.python3.vip/files/selenium/test4.html')
# --- alert ---
driver.find_element_by_id('b1').click()
# 打印 弹出框 提示信息
print(driver.switch_to.alert.text)
# 点击 OK 按钮
driver.switch_to.alert.accept()
confirm(确认信息)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://cdn1.python3.vip/files/selenium/test4.html')
# --- confirm ---
driver.find_element_by_id('b2').click()
# 打印 弹出框 提示信息
print(driver.switch_to.alert.text)
# 点击 OK 按钮
driver.switch_to.alert.accept()
driver.find_element_by_id('b2').click()
# 点击 取消 按钮
driver.switch_to.alert.dismiss()
prompt(提示输入)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://cdn1.python3.vip/files/selenium/test4.html')
# --- prompt ---
driver.find_element_by_id('b3').click()
# 获取 alert 对象
alert = driver.switch_to.alert
# 打印 弹出框 提示信息 print(alert.text)
# 输入信息,并且点击 OK 按钮 提交
alert.send_keys('web自动化 - selenium')
alert.accept()
# 点击 Cancel 按钮 取消
driver.find_element_by_id('b3').click()
alert = driver.switch_to.alert
alert.dismiss()
获取窗口大小
driver.get_window_size()
改变窗口大小
driver.set_window_size(x, y)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.163.com')
# 获取网站标题栏文本
print(driver.title)
# 获取网站地址栏文本
print(driver.current_url)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 打开网站
driver.get('https://www.baidu.com/')
# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
我们可以通过 desired_capabilities
参数,指定以手机模式打开chrome浏览器
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com')
input()
driver.quit()
在线图片压缩网站: https://tinypng.com/
网站页面上传文件的功能,是通过 type
属性 为 file
的 HTML input
元素实现的
<input type="file" multiple="multiple">定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可
# 先定位到上传文件的 input 元素
ele = wd.find_element_by_css_selector('input[type=file]')
# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')
上传多个文件,可以多次调用send_keys
ele = wd.find_element_by_css_selector('input[type=file]')
ele.send_keys(r'h:\g01.png')
ele.send_keys(r'h:\g02.png')
有的网页上传,是没有 file 类型 的 input 元素的。如果是Windows上的自动化,可以采用 Windows 平台专用的方法:
pip install pypiwin32
确保 pywin32 已经安装
# 找到点击上传的元素,点击
driver.find_element_by_css_selector('.dropzone').click()
sleep(2)
# 等待上传选择文件对话框打开
# 直接发送键盘消息给 当前应用程序,
# 前提是浏览器必须是当前应用
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
# 输入文件路径,最后的'\n',表示回车确定,也可能时 '\r' 或者 '\r\n'
shell.Sendkeys(r"h:\a2.png" + '\n')
sleep(1)
原文地址声明:https://blog.csdn.net/qq_23179075/article/details/99627909进入vue项目,安装cordova plugin add cordova-plugin-qrscanner修改后的页面<template> <div> <van-nav-bar left-arrow title="二维码扫描" safe-area-inset-top @click
QTP11.5(HP UFT 11.5)下载地址http://automationqa.com/forum.php?mod=viewthread&tid=1380&fromuid=29
通过阅读一个小的nodeJS project来学习nodeJS是一个不错的注意,而ry/node_chat代码相当精巧,而且贴近我们日常场景,所以选择它来开始我的nodeJS project源码阅读:ry/node_chat的代码结构如下:我会主要分析服务器端的两个nodeJS文件,fu.js和server.js,而client.js涉及的部分只是为了帮助理解server.js的逻辑。 fu.js的源代码分析(汉字注释部分是我添加的内容)// 通过require引用http, fs, sys, url对象或
在运行第一章的时候所出现得提示信息[email protected]:~/software/AI/chapter_1$ python download.pyWARNING:tensorflow:From download.py:5: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprec...
有没有大神分享一个纯python无框架写的webapi后端...python自学完了,想写个api练练手,CSS布局HTML小编今天和大家分享个案例代码来借鉴借鉴精华你可能有误解,无框架要比使用框架复杂的多。 你刚学完,应该是先试试简单的框架。python怎么响应后端发送get,post请CSS布局HTML小编今天和大家分享的接口测试用CGI,名字为test.py,放在apache的cgi-bin...
三个多月没更新博客,期间也有在学习和总结一些东西,只是或多或少都涉及到公司相关的信息(业务,JVM,WebServer)所以不便写出来,有时候写到一半发现又不太合适然后删除,很郁闷。之前一直比较关注web安全层面,如SQL注入、XSS、CSRF等等 ,然后HTTP协议层面,如HTTP Slowloris ,逐渐接触应用层以下(OSI七层模型)的东西,比如TCP SYN Flood相关。
一个简单的OpenMP例子 首先启动VisualStudio 2010,新建一个C++的控制台应用程序,如下图所示: 然后在项目解决方案资源管理器上选择项目名称,点击右键,选择“属性”,如下图所示: 然后在属性页上左侧选择“配置属性”——“C/C++”——“语言”,然后在右侧“OpenMP支持”后选
1 什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的对象 2)JSP是SUN公司开发的一个基于服务端的一种动态WEB开发技术 3)J...
总时间限制: 1000ms 内存限制: 65536kB描述把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。输入第一行是测试数据的数目t(0 输出对输入的每组数据M和N,用一行输出相应的K。样例输入17 3样例输出8来源[email protected]代码:#include #include
<br />本程序利用MCS51单片机实现了红外线解码,该程序我亲自测试过,实现了对电视机遥控板信号的解码。并应用上位机实现了对电脑鼠标的遥控。由于有一部分代码是汇编,一部分是C,所以需要在工程中进行设置,由于有很久了,我也忘记怎么设置了,本想上传整个工程文件的,结果好象在这里上传不了,需要的请留EMAIL,我发过去。否则可以自己在网上收一下C和汇编混合编程的设置。<br /> <br />/*************晶体为11.0592M,波特率9600bps<br />***************学习
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5246分析:贪心思想。我们先把每个挑战者按战斗力升序排序,然后找出离m最近的小于m的挑战者的战斗力x,赋初值cnt=x,并纪录该挑战者的下标tmp,然后从i=tmp开始遍历,对于后面的每一个挑战者,其战斗力为a[i],如果cnt+k0时k--,直至遍历所以的挑战者,如果flag的值为true