selenium之长截图、弹窗处理和简单文件处理

2,234 阅读3分钟

python selenium实现长截图

例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time
def get_image(url, pic_name):
#chromedriver的路径
    chromedriver = r"C:\Users\name\AppData\Local\Google\Chrome\Application\chromedriver.exe" 
    os.environ["webdriver.chrome.driver"] = chromedriver 
#设置chrome开启的模式,headless就是无界面模式
#一定要使用这个模式,不然截不了全页面,只能截到你电脑的高度 
chrome_options = Options() 
chrome_options.add_argument('headless') 
driver = webdriver.Chrome(chromedriver,chrome_options=chrome_options) 
#控制浏览器写入并转到链接 
driver.get(url) 
time.sleep(1) 
#接下来是全屏的关键,用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
print(width,height) 
#将浏览器的宽高设置成刚刚获取的宽高 
driver.set_window_size(width, height) 
time.sleep(1) 
#截图并关掉浏览器 
driver.save_screenshot(pic_name) 
driver.close() 
#你输入的参数 
url = 'https://movie.douban.com/top250' 
pic_name = r'D:\image.png' 
get_image(url, pic_name)

弹出框

弹出框有三种,分别是:alert,confirm,prompt

弹出框的主要操作方法:

ext:获取文本值

accept() :点击"确认"

dismiss() :点击"取消"或者关闭弹出框

send_keys() :输入文本值

alert

alert是HTML DOM 中用到的一种脚本语言,它的中文意思是“提醒”。它是JavaScript或VBscript脚本语言中窗口window对象的一个常用方法;其主要用法就是在你自己定义了一定的函数以后,通过执行相应的操作,所弹出对话框的语言。并且alert对话框通常用于一些对用户的提示信息。常见的为alert函数。.

confirm

confirm是JavaScript 语言中HTML DOM的一个方法。主要用法是:显示一个带有指定消息与“确定”及“取消”按钮的对话方块。

prompt

prompt是javascript语言中的一个方法,主要用处是显示提示对话框。

alert

自己写了一个alert的弹框,复制下面代码,存放在记事本中,后缀名改成html就行了

<html>
<head> 
<script type="text/javascript">

function display_alert() 
  { 
  alert("测试") 
  }
  
  </script>
  
  </head>
  <body> 
  <center> 
  <input id="anjing" type="button" onclick="display_alert()" 
  value="点击我,有惊喜!" /> 
  </center> 
  </body> 
  </html>

操作弹出框可以通过selenium进行切换到弹出框上,然后在进行一系列的操作。切换到弹出框方法: switch_to_alert()

话不多说,上代码

from selenium import webdriver 
import time 
driver = webdriver.Chrome() 
path = r'E:\web\alert.html' 
driver.get(path) 
driver.find_element_by_id('anjing').click() 
# 切换到alert 
a = driver.switch_to_alert() 
# 打印弹出框文本内容 
print(a.text) 
time.sleep(2) 
# 点击确定 
a.accept()

1171635-20200812174756292-235882714.gif

confirm

写了一个confirm的文件。也是通过上面的方法进行操作

html:

<html> 
<head> 
<script type="text/javascript"> 
function disp_prompt() 
  { 
  var name=prompt("开始测试") 
  if (name!=null && name!="") 
  { 
  document.write("测试") 
   } 
  } 
  </script> 
  </head> 
  <body> 
  
  <input type="button" onclick="disp_prompt()" value="点我,点我有惊喜" /> </body> 
  </html>

通过selenium运用 switch_to_alert() 进行切换到弹出框中,然后在点击取消,再次点击确定

from selenium import webdriver 
import time driver = webdriver.Chrome() 
path = r'E:\web\confirm.html' 
driver.get(path) 
driver.find_element_by_id('anjing').click() 
# 切换到alert 
a = driver.switch_to_alert() 
# 打印弹出框文本内容 
print(a.text) 
time.sleep(4) 
# 点击取消 
a.dismiss() 
print(a.text) 
time.sleep(4) 
# 点击确定 
a.accept()

1171635-20200812185612820-1466670257.gif

prompt

同样是上述方法,这次的弹出框存在输入框,可以通过send_keys方法进行输入内容

html:

<html> 
<head> 
<script type="text/javascript"> 
function disp_prompt() 
{ 
var name=prompt("开始测试") 
if (name!=null && name!="") 
{ 
document.write("测试") 
  } 
} 
</script> 
</head> 
<body> 

<input type="button" onclick="disp_prompt()" value="点我,点我有惊喜" /> 
</body> 
</html>

这里我们也可以通过send_keys()输入内容

from selenium import webdriver 
import time 
driver = webdriver.Chrome() 
path = r'E:\web\prompt.html' 
driver.get(path) 
driver.find_element_by_id('anjing').click() 
# 切换到alert 
a = driver.switch_to_alert() 
# 打印弹出框文本内容 
print(a.text) 
time.sleep(4) 
# 点击取消 
a.send_keys('测试') 
time.sleep(1) 
# 点击确定 
a.accept()

其他方法

我们可以通过其他方法进行跳转到alert,这里需要用到Alert模块,遇到模块,首先进行导入 from selenium.webdriver.common.alert import Alert

from selenium import webdriver 
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.alert import Alert 
driver = webdriver.Chrome() 
path = r'E:\web\prompt.html' 
driver.get(path) 
driver.find_element_by_id('anjing').click() 
# 切换到alert 
WebDriverWait(driver, 5).until(EC.alert_is_present()) 
# 等待弹出窗口出现 
# alert = driver.switch_to.alert 
# 跳转到alert 
alert = Alert(driver) 
print(alert.text) 
alert.accept()

判断弹出框

执行代码过程中,可能会因为其他因素,网速慢等情况导致弹出框没有出现,我们可以通过判断元素中判断弹出框时否出现来进行操作

from selenium import webdriver 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
import time 
driver = webdriver.Chrome() 
path = r'E:\web\prompt.html' 
driver.get(path) 
driver.find_element_by_id('anjing').click() 
# 切换到alert 
WebDriverWait(driver, 5).until(EC.alert_is_present()) # 等待弹出窗口出现
alert = driver.switch_to.alert 
print(alert.text) 
alert.accept()

文件上传

input标签

众所周知,input标签是可以send_key的

from selenium import webdriver 
driver = webdriver.Firefox() driver.get('http://sahitest.com/demo/php/fileUpload.htm') 
upload = driver.find_element_by_id('file') 
upload.send_keys('d:\\baidu.py') # send_keys print
upload.get_attribute('value') # check value 
driver.quit()

很明显,对于input上传,直接send_keys是最简单的解决方案。