selenium特殊操作:键盘时间,切换表单,多窗口切换,等待

selenium键盘事件

在使用键盘按键方法前需要先导入 keys 类。

以下为常用的键盘操作: send_keys(n*Keys.BACK_SPACE) 删除键(BackSpace),删除几个n就是几,

send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表键(Tab) send_keys(Keys.ESCAPE) 回退键(Esc) send_keys(Keys.ENTER) 回车键(Enter) send_keys(Keys.CONTROL,'a') 全选(Ctrl+A) send_keys(Keys.CONTROL,'c') 复制(Ctrl+C) send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X) send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V) send_keys(Keys.F1) 键盘 F1

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
​
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
​
driver.get("http://www.baidu.com")
​
# 定位百度输入框
search_ele = driver.find_element_by_id("kw")
# 输入内容
search_ele.send_keys("pythonJAVA")
time.sleep(5)
​
# 删除多余的m
# Keys.BACK_SPACE 执行一次,删除一个字母,那些删除多个字母?*Keys.BACK_SPACE
search_ele.send_keys(4*Keys.BACK_SPACE)
​
time.sleep(5)
# 输入内容之后,直接让回车就能搜索
search_ele.send_keys(Keys.ENTER)

设置元素等待

设置元素等待就是为了解决,代码执行太快了,页面确没有加载出来,这时候去定位元素就会报错

'''
webdriver---等待设置
1.隐式等待driver.implicitly_wait(10),固定的每次都写,全局有效。
优点:什么时候元素出现什么时候停止等待,灵活;根据情况,超过等待时间就结束
缺点:只能解决因为页面元素未加载而引起的NoSuchElementException这种异常
​
2.import time  强制等待
  time.sleep
  语法简单,但尽量少用,常用做调式,加了这个时间等待如果还不对,就是代码的问题
​
3.显示等待:可针对每一个元素进行单独设置,等待时间更加灵活.
***一般隐式等待无法解决的问题,又不知道等待几秒就不能用import time;会用到显示等待***
  就是写法是比较麻烦的
  title_is (strtitle) 判断当前页面的title是否精确等于预期
  title_contains(strtitle) 判断当前页面title是否包含指定字符串
  presence_of_element_located(locator)判断某个元素是否被加了DOM树里,并不代表该元素一定可见
  visibility_of_element_located(locator)判断某个元素是否肉眼可见,可见代表元素非隐藏,并且元素和宽高都不等于0
  invisibility_of_element_located(locator)判断某个元素是否不可见
  element_to_be_clickable(locator)判断某个元素是否可见并且是 enable的,这样的话才叫clickable
  text_to_be_present_in_element(locator):判断某个元素中的text是否包含了预期的字符串
​
#因为前面两种写的比较多,这里不在举例子了。显示等待我不太会写,目前不知道运用到什么场景
'''

关于元素等待的方式有:

  • 强制等待

    强制等待就是time.sleep(5),这个方法是time模块提供的,并不是selenium这个框架提供的,其实设置的线程的休眠,它是不管后面元素是否加载出来,都会等待5秒钟

  • 显示等待

    显示等待,是给单独某个元素设置的,(一般情况下隐式等待不要加入设置10s大部分元素都能在10s内加载出来,但是唯独有 一个元素无法在10s内加载出来,那么就给这个元素设置显示等待)
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    ​
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    ​
    driver.get("http://www.baidu.com")
    ​
    # 假设百度搜索框加载的时候不固定,需要设置显示等待
    """
    WebDriverWait(
    driver,  打开的浏览器对象
    20,      该元素的最大超时时间
    0.2      轮询时间(在最大超时时间之内,每隔多少秒去检查一次这个元素是否加载出来)
    )
    EC.presence_of_element_located() 里面接受的是一个元组,元组中是定位方式和表达式 (定位方式,表达式)
    By.ID 通过id的方式
    By.XAPTH  必须是大写的
    """
    # 定位百度搜索框
    search_ele = WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.ID, "kw")))
    # 输入内容
    search_ele.send_keys("李小璐")
    # 输入回车按钮
    search_ele.send_keys(Keys.ENTER)
  • 隐式等待

    driver.implicitly_wait(10)
    隐式等待,一旦设置,对于后续的每一个元素都有效,可以设置最大超时时间,如果执行到那个元素加载出来了就继续往后执行,如果发现某元素没有加载出来呢?隐式等待就会采用轮询的方式去判断该元素在页面上是否加载出来,加入第2秒就已经加载出来了,那么就会继续往后执行,如果超过10s还没出来,就报错

定位一组元素

WebDriver还提供了8种用于定位一组元素的方法。

find_elements_by_id() find_elements_by_name() find_elements_by_class_name() find_elements_by_tag_name() find_elements_by_link_text() find_elements_by_partial_link_text() find_elements_by_xpath() find_elements_by_css_selector()

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
​
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
​
driver.get("http://www.baidu.com")
​
# 定位搜索框
search = driver.find_element_by_id("kw")
# 输入内容
search.send_keys("李小璐")
# 直接回车
search.send_keys(Keys.ENTER)
​
# 获取搜索到的内容的 标题
# 我们之前的八种方式都可以写成定位一组元素的方式,只有后面的表达式获取的是一个集合,就可以
# find_elements_by 获取回来的结果是放在了一个列表中
titles = driver.find_elements_by_xpath("//h3/a")
​
# 遍历输出列表
for t in titles:
    print(t.text)
​

表单切换

在元素定位的时候,有些元素的属性的值是会变得,例如 id属性的值。怎么判断,会不会改变?打开同一个网页两次,如果不一样则就是动态的,还以去看如果属性的值是这种无序的数字或者字母,那么就值得怀疑

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
​
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
​
driver.get("https://www.126.com/")
​
​
# 由于这个邮箱输入框、密码输入框、登录按钮都在这个iframe子页面中,所以,要先进行切换
# 1.先定位到这个iframe标签,至于那个方式任选
iframe_elmenet = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe')
​
# 2切换表单
driver.switch_to.frame(iframe_elmenet)
​
# 输入用户名
driver.find_element_by_css_selector('input[name="email"]').send_keys("zsdfcsf")
# 输入密码
driver.find_element_by_css_selector('input[name="password"]').send_keys("aszdfasdf")
# 点击 登录 按钮
driver.find_element_by_id('dologin').click()
​
# 由于上面已经切换到了里面的iframe标签,而vip又是在外层的页面,所以需要切换出来
# 直接切换到最外层
driver.switch_to.default_content()
​
time.sleep(3)
# 点击 vip
driver.find_element_by_xpath('//*[@href="https://vipmail.163.com/?from=fmail"]').click()

多窗口切换

在浏览器中有一个句柄的概念,如果打开多个窗口的时候,那么句柄默认是在打开的第一个页面上,如果你需要操作新打开的窗口,则需要将句柄切换过去才可以

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
​
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
​
driver.get("http://www.baidu.com")
​
# 定位百度输入框
search_ele = driver.find_element_by_id("kw")
# 输入内容
search_ele.send_keys("周琦(1996年1月出生的中国篮球运动员) - 百度百科")
​
time.sleep(2)
# 输入内容之后,直接让回车就能搜索
search_ele.send_keys(Keys.ENTER)
time.sleep(3)
# 要点击 周琦百度百科
driver.find_element_by_xpath('//div[@id="content_left"]/div[1]//h3/a').click()
​
# 获取所有的窗口句柄
# 获取回来的多个窗口句柄保存在列表中 [第一个窗口句柄,第二个窗口句柄],窗口句柄就类似于浏览器窗口的id是唯一的
handles = driver.window_handles
print(handles)
# 由于每次打开的新窗口的句柄永远是列表下标为-1的元素
driver.switch_to.window(handles[-1])
​
time.sleep(2)
# 点击 编辑
driver.find_element_by_xpath('//span[@class="btn-list"]/a[2]').click()

表单和窗口切换练习

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
​
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
​
driver.get("https://www.126.com/")
​
​
# 由于这个邮箱输入框、密码输入框、登录按钮都在这个iframe子页面中,所以,要先进行切换
# 1.先定位到这个iframe标签,至于那个方式任选
iframe_elmenet = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe')
​
# 2切换表单
driver.switch_to.frame(iframe_elmenet)
​
# 输入用户名
driver.find_element_by_css_selector('input[name="email"]').send_keys("zsdfcsf")
# 输入密码
driver.find_element_by_css_selector('input[name="password"]').send_keys("aszdfasdf")
# 点击 登录 按钮
driver.find_element_by_id('dologin').click()
​
# 由于上面已经切换到了里面的iframe标签,而vip又是在外层的页面,所以需要切换出来
# 直接切换到最外层
driver.switch_to.default_content()
​
time.sleep(3)
# 点击 vip
driver.find_element_by_xpath('//*[@href="https://vipmail.163.com/?from=fmail"]').click()
​
# 输入用户名密码
# 由于打开了一个新的窗口页面,先要切换窗口
handles = driver.window_handles
driver.switch_to.window(handles[-1])
​
# 由于这个页面也有iframe标签,所以先切换
vip_iframe = driver.find_element_by_xpath('//*[@id="urs-login163"]/iframe')
driver.switch_to.frame(vip_iframe)
​
# 输入vip邮箱
driver.find_element_by_name('email').send_keys("asdassd")
# 输入vip邮箱密码
driver.find_element_by_name("password").send_keys("asdsad")
​
# 点击 登录
driver.find_element_by_id('dologin').click()
​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值