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()