seleniumselenium各种技巧,滑动,提示框,窗口大小,iframe切换等等

1 、打开浏览器

方法一:默认安装到C盘,Chrome

from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome()
#放大浏览器
driver.maximize_window()
# 打开百度浏览器
driver.get("http://www.jianshu.com")
driver.implicitly_wait(10)

方法二:Chrome浏览器没有安装到C盘

from selenium import webdriver
options = webdriver.ChromeOptions()
options.binary_location = r"E:softGoogleChrome_72ChromePortableAppGoogle Chromechrome.exe"
driver = webdriver.Chrome(executable_path=r"E:softpython3.6chromedriver.exe",chrome_options=options)
driver.get("https://www.baidu.com")
#浏览器窗口最大化
driver.maximize_window()
#隐式等待10s
driver.implicitly_wait(10)

2、获取元素信息

    1. text 属性,显示该元素在web页面显示出来的文本内容

    2. get_attribute方法

      获取某个属性的值:

        element.get_attribute(元素属性)

        element.get_attribute('href')

        element.get_attribute('style')

      获取该元素对应HTML源代码:

        element.get_attribute('outerHTML')

      获取该元素的内部部分的HTML源代码:

        element.get_attribute('innerHTML')

3、BeautifulSoup4库  

    这种方式使用的频率很少,大家可以百度查找详细的介绍信息

4、隐士等待时间

    driver.implicitly_wait(10)

5、显示等待

    from selenium.webdriver.support.ui import WebDriver

    from selenium.webdriver.support import expected_conditions as EC

    from selenium.webdriver.common.by import By    

    ele = WebDriverWait(driver,60)

    until(EC.presence_of_element_located((By.ID,'username')))

    #等待60s,知道一个元素出现,id为username的元素

      举个实例:  

#为id为1的元素先设置隐士等待=60秒,无论找到未找到,隐士等待时间都会重置为10秒
driver.implicitly_wait(60)
try:
    ele = driver.find_element_by_id('1')
    print (ele.text)

    if ele.text.startswith('松勤网 - 松勤软件测试')
        print('pass')
    else:
        print('fail')
except:
    print('exception happend')
finally:
    driver.implicitly_wait(10)

6、frame处理 : 网页中内嵌的网页,frame/iframe

      切换frame

        driver.switch_to.frame(frame_reference)

          1. frame元素的name属性或者ID属性

          2. 索引值(从0开始)

          3. frame所对应的WebElement :   driver.find_element_by_tag_name("iframe")

      切换回主html里面:  driver.switch_to.default_content() 

                   切换到上一层frame框:driver.switch_to.parent_frame()

from selenium import webdriver
from test import mysql_test as myS
import time
driver = webdriver.Chrome(executable_path=r"E:softpython3.6chromedriver.exe")
driver.get("https://mail.qq.com/cgi-bin/loginpage")
#浏览器窗口最大化
driver.maximize_window()
#隐式等待10s
driver.implicitly_wait(10)

#切换iframe,切换后点击切换后的iframe对应的元素
driver.switch_to.frame(driver.find_element_by_id("login_frame"))
driver.find_element_by_id("u").send_keys("123456")
#切换原html
driver.switch_to.default_content()
#点击微信登录
driver.find_element_by_id("wxLoginTab").click()
#切换到iframe框架
wei = driver.find_element_by_id("login_wx_iframe")
driver.switch_to.frame(wei)
#获取标题
print (driver.title)
#获取当前的URL
print(driver.current_url)
#截图
driver.get_screenshot_as_file('d://ssl.png')
#获取窗口的大小,返回字典{'width': 1936, 'height': 1056}
size = driver.get_window_size()
print (size)
driver.set_window_size(size['width'],400)

7、切换窗口,句柄handle

  切换到新的窗口里面操作

    1.循环遍历  driver.window_handles

    2.driver.switch_to.window(handle)方法切入新窗口

    3.检查该窗口特点,是否为要切入的那个

  切换最初的窗口

    保存主窗口的handle

  关闭窗口

    close方法 

#获取浏览器所有的handle
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys("松勤自动化 ")
driver.find_element_by_css_selector("[id='1']>h3>a").click()
print(driver.window_handles)

#循环遍历所有的handle,如果浏览器的title等于某一个title,或者某一个title里面存在某一个元素
for handle in driver.window_handles:
#切换新窗口
driver.switch_to.window(handle)
if driver.title == '预期窗口':
break

#循环遍历所有的handle,跳转到窗口,如果元素找到则跳转
for handle in driver.window_handles:
#切换新窗口
driver.switch_to.window(handle)
#判断当前窗口的特征是否为目标窗口
eles=driver.find_elements_by_css_selector("span>[href='/course/explore']")
if eles:
    eles[0].click()
    break

7、清除元素中的字符串

    clear方法  :  input1.clear()

8、获取文本框中输入的内容

    get_attribute() : 获取input元素里面输入的文本内容

    input1.get_attribute('value')

9、单选框:type类型是radio

    type = "radio"

    click()方法选择 : 不管原来该元素是否选中,直接去点击该元素没有问题都可以确保该单选框选中

              

driver.find_element_by_css_selector("[value='male']").click()
driver.find_element_by_css_selector("[value='female']").click()
 #是否被选中
male = driver.find_element_by_css_selector("[value='male']")
if male.is_selected:
  print ("单选框被选中")
else:
  print ("未被选中")

10、勾选框:type类型CheckBox

    type = "checkbox"

    click()方法选择 

    is_selected()方法来获取选择的状态:

        True :已经选中

        False:未选中

ele1=driver.find_element_by_css_selector("[value='bike]'")
#如果选中pass,未选中则让其点击选中
if ele1.is_selected():
    pass
else:
    ele1.click()

#选中所有的勾选框
eles=driver.find_elements_by_tag_name('input')
for ele in eles:  
    #没有被选中,则让选中
    if not ele1.is_selected():
        ele1.click()

11、复选框

    select,有multiple可以多选,不写则单选    

    可以用selenium的Select类

    导入类: from selenium.webdriver.support.ui import Select

    方法deselect_all() : 清掉所有选中的元素

    方法select_by_visible_text("值"):根据复选框中文本信息选中

可以选择多个的复选框:

    实例如下:

#导入Select类
from selenium.webdriver.support.ui import Select
#获得相应的WebElement
select = Select(driver.find_element_by_id("multi"))
#去除选择所有的选项
select.deselect_all()
select.select_by_visible_text("雅阁")
select.select_by_visible_text("宝马 740")

#获得相应的WebElement
select = Select(driver.find_element_by_id("single"))
select.select_by_visible_text("男")

#其他几种选中复选框中内容的方法# 获得相应的WebElement
select = Select(driver.find_element_by_id("select"))
# 先取消选择所有的选项
select.deselect_all()
# 通过文本选中 玛莎拉蒂
select.select_by_visible_text("玛莎拉蒂")
# 通过 value 值选中 兰博基尼
select.select_by_value("Lamborghini")
# 通过 index 选择元素,索引从0开始
select.select_by_index(2)

只能选择单个复选框

se2=Select(driver.find_element_by_id('single'))
se2.select_by_value('male')

12、获取标题

    driver.title

13、获取当前url

    driver.current_url

14、简单的断言

    assert driver.title == "百度一下,你就知道"     

   # 当前浏览器的标题是否是“百度一下,你就知道”

15、截屏:

  截取整个页面的方法

      driver.get_screenshot_as_file(r'd:aidu.png')       

      # 括号里面填写文件名称,也可以固定保存路径

  获取某一个区域的图片

      ele=driver.find_element_by_cas_selector('img[class="d-flag"]')

      ele.screenshot(r'D:music.png')

16、上传文件,调用系统的Windows框去上传

需要依赖的第三方库:  pip  install  pypiwin32

import time
import win32com.client
from selenium import webdriver

# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://tinypng.com/")
driver.find_element_by_css_selector(".icon").click()
# 因为页面控件和Windows自带的框不一致,因此需要等待让系统的弹窗出来
time.sleep(3)

#开始上传文件,调用Windows窗口
shell = win32com.client.Dispatch("WScript.Shell")
# 输入需要上传文件的路劲,回车换行
shell.SendKeys(r"E:	est.txt"+"
")
time.sleep(3)
driver.quit()

17、浏览器的操作,刷新页面、前进、后退

  • 刷新页面  refresh
  • 前进:forward
  • 后退:back
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
print(driver.title)
driver.find_element_by_id("kw").send_keys("自动化测试
")
#后退
driver.back()
time.sleep(3)
print(driver.title)
#刷新页面
driver.refresh()
time.sleep(3)
#前进
driver.forward()
time.sleep(3)
print(driver.title)
driver.quit()

 18、滑动屏幕,改变窗口默认大小

  

import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://music.163.com/")
#设置浏览器的窗口大小
driver.set_window_size(480,500)
time.sleep(2)
#操作搜索框
driver.find_element_by_id("srch").send_keys("周杰伦
")
input()
driver.quit()

 报错:message:element not interactable 表示这个元素在页面上不可见,需要拖动下拉框才能看到这个元素,

这个时候需要让元素在页面上可见,才可操作

  • 需要将页面最大化去操作: driver.maxmize_window()

滚动条:

  1.使用js,有时候页面禁止了js脚本,则需要用其他方法2

    可以现在浏览器中验证一下,如果不确定是否可以滑到最下面,

               可以加个循环多滑动几次。

      

from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#操作搜索框
driver.find_element_by_id("kw").send_keys("松勤
")
#滚动页面,js方法
driver.execute_script("scrollBy(0,2000)")
#点击下一页
driver.find_element_by_css_selector("#page>a:nth-child(10)").click()
driver.quit() 

 滚动条:直接滑到页面底部和顶部

#滚动条操作
# 直接滑动到底部
js="var q=document.documentElement.scrollTop=10000"
# 直接滑动到顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

 2. 模拟键盘

     需要导入库:   

    import win32api

    import win32con

import time
import win32api
import win32con
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://music.163.com/")
driver.implicitly_wait(10)
driver.switch_to.frame("g_iframe")
time.sleep(1)
#需要点击一下空白页面,交互一下
driver.find_element_by_css_selector(".v-hd3 .f-fl").click()
time.sleep(1)
for i in range(5): #循环5次,按键盘向下键
    win32api.keybd_event(win32con.VK_DOWN,0)
    time.sleep(0.5)
for i in range(5): #循环5次,按键盘向上键
    win32api.keybd_event(win32con.VK_UP,0)
    time.sleep(0.5)
for i in range(5): #循环5次,按键盘空格键
    win32api.keybd_event(win32con.VK_SPACE,0)
    time.sleep(0.5)
for i in range(5):  # 循环5次,按键盘向右键
    win32api.keybd_event(win32con.VK_RIGHT, 0)
    time.sleep(0.5)
for i in range(5): #循环5次,按键盘向左键
    win32api.keybd_event(win32con.VK_LEFT,0)
    time.sleep(0.5)
driver.quit()

  3.获取窗口大小

    size=driver.get_window_size() #返回的是一个字典,可以通过键值对的思路去获取数据

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#设置窗口大小
driver.set_window_size(1400,500)
time.sleep(1)
#获取窗口大小信息,返回的是一个字典
size=driver.get_window_size()
print(size)
print("{},height:{}".format(size['width'],size['height']))
driver.quit()

 19、页面的二次渲染后,再次定位元素

 一般情况下报错:stale  element  reference表示页面进行了二次渲染

解决方法,可以将触发的这个按钮再次定位,去触发,比如下面的删除按钮,

放到循环里面,让其每次触发。

  

 20、模拟鼠标悬停,拖动

 需要导入ActionChains类:

from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains()
# click需要传入需要操作的元素,返回的都是自己本身,因此可以连续调用,
# 需要执行的话必须有perform()方法
ac.click(input1).send_keys("input1").click(input2).send_keys("input2").
click(input3).send_keys("input3").perform()
# 定位到需要悬停的元素
move = driver.find_element_by_id("XXXXX")
# 对定位到的元素执行悬停操作
ActionChains(driver).move_to_element(move).perform()

#拖动
#两个参数,拖动的起点和终点,鼠标按下的位置和鼠标松开的位置
ac.drag_and_drop(soure,target)

21、冻结页面

        某些元素在页面无法定位,则需要冻结页面,相当于加了一个debug,几秒后冻结窗口

  #多少秒之后对页面进行冻结

  setTimeout(function(){debugger},3000)

        

23、让系统发出声音,提示用户做一些操作

import  winsound

winsound.Beep(2200,3000) #(声音频率,声音时间)

例如:输入验证码,让系统发出一段声音,提示人去完成验证码的工作

import  winsound
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#系统自动提示声音,(分贝,延长时间)
winsound.Beep(1000,8000)
driver.quit()

  

弹出对话框:

对话框一般来说有三种:

  alert,confirm,prompt

操作方法:

driver.switch_to.alert.accept()      #点击OK

driver.switch_to.alert.text      # 得到对话框内容

driver.switch_to.alert.dismiss()   # 点击cancel

driver.switch_to.alert.send_keys()   # 输入内容

1、alert对话框

 

# 针对这种对话框,python提供了一种方式,alert
#触发alert
driver.find_element_by_id('b1').click()
#切换到alert框上面
al = driver.switch_to.alert
#获取alert框上面的信息
print(al.text)
#使用accept方法点击“确定”
al.accept()

2、confirm对话框

# 针对这种对话框,python提供了一种方式,alert
#触发alert
driver.find_element_by_id('b2').click()
#切换到alert框上面
al = driver.switch_to.alert
#获取alert框上面的信息
print(al.text)
#使用accept方法点击“确定”
al.accept()
#使用dismiss方法点击“取消”
al.dismiss()

3. prompt对话框

driver.find_element_by_id('b3').click()
driver.switch_to.alert.send_keys("hello  promot")
driver.switch_to.alert.accept()
driver.switch_to.alert.dismiss()

后面有新增的内容,可以继续补充。。。。。。

欢迎大家可以提更多的建议。。。。。。

原文地址:https://www.cnblogs.com/yangguanghuayu/p/11496686.html