控制浏览器窗口大小:set_window_size()方法
设置全屏模式下运行:maximize_window()方法
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.set_window_size(500, 500)
- time.sleep(5)
- driver.maximize_window()
- time.sleep(5)
- driver.quit()
控制浏览器前进、后退:back(),forward()方法
模拟浏览器刷新:driver.refresh()方法,模拟手动刷新(F5按键)
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- driver.find_element(By.ID,"kw").send_keys("hello")
- driver.find_element(By.ID,"kw").clear()
- driver.find_element(By.ID,"kw").send_keys("after")
- ele = driver.find_element(By.ID,"su")
- print("info: text:",ele.text, ";size:", ele.size)
- driver.find_element(By.ID,"su").submit()
- time.sleep(5)
- driver.quit()
webdriver中,与鼠标相关的操作都封装在ActionChains类中。
ActionChains类提供了常用的鼠标操作的方法:
- from selenium import webdriver
- from selenium.webdriver import ActionChains
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- time.sleep(5)
- # 定位到要悬停的元素
- above = driver.find_element(By.LINK_TEXT, '更多')
- # 对定位到的元素执行悬停操作
- ActionChains(driver).move_to_element(above).perform() # perform 提交类中存储的行为
- time.sleep(5)
- driver.quit()
前面使用send_keys()来模拟键盘输入,还可以用它来模拟键盘上的按键,甚至是组合键,如Ctrl+a等
- from selenium import webdriver
- from selenium.webdriver import ActionChains
- from selenium.webdriver.common.by import By
- from selenium.webdriver.common.keys import Keys
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- time.sleep(5)
-
- driver.find_element(By.ID,"kw").send_keys("hello")
- driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "a")
- time.sleep(5)
- driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "x")
- time.sleep(5)
- driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "v")
- time.sleep(5)
- driver.find_element(By.ID,"su").submit()
- time.sleep(5)
- driver.quit()
WebDriver提供了2中等待方式,显示等待和隐式等待
显示等待是指WebDriver等待某一条件成立,则继续执行;否则在达到最大等待时间时抛出异常(TimeoutException)
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- element = WebDriverWait(driver, 10, 0.5).until(
- EC.visibility_of_element_located((By.ID, "kw"))
- )
-
- element.send_keys("hello")
- driver.find_element(By.ID,"su").submit()
- time.sleep(5)
- driver.quit()
webdriverwait一般与until和until_not方法配合使用:
WebDriver 提供的implicitly_wait()方法可用来实现隐式等待,用法相对来说简单的多;
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.common.exceptions import NoSuchElementException
- import time
-
- driver = webdriver.Chrome()
- driver.implicitly_wait(10) # 隐式等待
- try:
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- driver.find_element(By.ID, "kw2").send_keys("hello")
- except NoSuchElementException as e:
- print(e)
- finally:
- driver.quit()
implicitly_wait()参数是秒。这个方法不是一个固定的等待,不影响脚本的执行速度;并且它会等待页面上所有元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行,否则,它将会以轮询的方式不断判断元素是否存在,直到达到设置的等待时间,还没有定位到元素,就会抛出异常。
定位一组元素的方法与定位某个元素的方法非常像,唯一的区别就是单词element 后面多了一个’s',用来表示负数,使用方法与定位一个元素一样:
在web 应用中会遇到frame/iframe表单嵌套页面的应用,webdriver 只能在一个页面上对元素进行识别和定位,这时候需要一driver.switch_to.frame()方法来切换到frame内嵌页面上。
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://mail.163.com")
- driver.maximize_window()
- time.sleep(5)
- login_frame = driver.find_element(By.CSS_SELECTOR, "[id^=x-URS-iframe]") # id后半部分的数字是随机的,因而采用css定位使用“^=”来匹配以xxx开头的元素。
- driver.switch_to.frame(login_frame)
- driver.find_element(By.NAME, "email").send_keys("wxjvv8")
- driver.find_element(By.NAME, "password").send_keys("111111@")
- driver.find_element(By.ID, "dologin").click()
-
- driver.switch_to.default_content() # 最后通过switch_to.default_content()方法回到最外层的页面
- driver.quit()
switch_to.frame()方法默认可以对表单的id属性或name属性传参,因而可以定位元素的对象。
页面操作过程中,有时单击某个链接会跳转到新的窗口,这时就需要跳转到新的窗口进行操作。WebDriver提供 switch_to.window()方法来实现在不同窗口间的切换。
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- driver.implicitly_wait(10)
- # 获取当前窗口句柄
- cur_handle = driver.current_window_handle
- # 点击登录-注册,窗口跳转
- driver.find_element(By.LINK_TEXT, "登录").click()
- driver.find_element(By.LINK_TEXT, "立即注册").click()
- all_handles = driver.window_handles
- time.sleep(5)
- # 返回百度搜索页面
- for handle in all_handles:
- if handle != cur_handle:
- driver.switch_to.window(cur_handle)
- print("switch to", driver.title)
- time.sleep(5)
- driver.quit()
WebDriver处理JavaScript生成的alert、confirm、和prompt警告框的方法是 使用switch_to.alert()方法定位,然后使用下面的API操作:
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
-
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- driver.maximize_window()
- driver.implicitly_wait(10)
- # 弹出警告框
- driver.find_element(By.ID, "s-usersetting-top").click()
- driver.find_element(By.CSS_SELECTOR, "#s-user-setting-menu > div > a.setpref.first > span").click()
- driver.find_element(By.LINK_TEXT, "保存设置").click()
- # 切换到警告框
- alert = driver.switch_to.alert
- # 获取警告框文本
- print("alert text:",alert.text)
- # 接受警告框
- alert.accept()
-
- time.sleep(5)
- driver.quit()
WebDriver提供了Select类来处理下拉框
- from time import sleep
- from selenium import webdriver
- from selenium.webdriver.support.select import Select
-
- dri = webdriver.Chrome()
-
- dri.get('https://www.baidu.com')
-
- # 打开搜索设置
- link = dri.find_element_by_link_text('设置').click()
- dri.find_element_by_link_text('搜索设置').click()
- sleep(2)
-
- # 搜索结果显示条数
- sel = dri.find_element_by_xpath("//select[@id='nr']")
-
- # value = "20"
- Select(sel).select_by_value('20')
- sleep(2)
-
- #
- Select(sel).select_by_visible_text("每页显示50条")
- sleep(2)
-
- # 根据下拉选项的索引进行选择
- Select(sel).select_by_index(0)
- sleep(2)
-
- dri.quit()
WebDriver没有提供专门用于上传的方法,要实现上传,关键在于思路。
在web页面中,一般点击上传,会打开本地windows窗口,从窗口选择文件进行上传。然而WebDriver无法控制windows控件,所以我们一般通过以下两种方式实现文件上传:
WebDriver 可以设置默认的下载路径,不同的浏览器设置的方式不同。