Python+Selenium+Chrome 自动化测试(下)

in #it6 years ago

---恢复内容开始---设置元素等待webDriver提供了两种类型的等待:显式等待和隐式等待显式等待不说了,就用简单的隐式等待即可

隐式等待

WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单得多。

from selenium import webdriver
# 导入异常类型
from selenium.common.exceptions import NoSuchElementException
from time import ctime

driver = webdriver.Chrome()

# 设置隐式等待为10秒
driver.implicitly_wait(10)

driver.get("http://www.baidu.com")

try:
   print(ctime())
   driver.find_element_by_id("kw22").send_keys('selenium')

# 捕捉超时异常
except NoSuchElementException as e:
   print(e)
finally:
   print(ctime())
   driver.quit()

implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。 定位一组元素的方法(比之前的单个元素多加了个s)

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 time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)

# 定位一组元素
texts = driver.find_elements_by_xpath('//div/h3/a')

# 循环遍历出每一条搜索结果的标题
for t in texts:
   print(t.text)

driver.quit()

窗口切换

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

# 获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle

driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()

# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles

# 进入注册窗口
for handle in all_handles:
   if handle != sreach_windows:
      
       # 切换到句柄所代表的窗口
       driver.switch_to.window(handle)
       print('now register window!')
       driver.find_element_by_name("userName").send_keys('username')
       driver.find_element_by_name('password').send_keys('password')
       time.sleep(2)

警告框处理在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()

# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
time.sleep(1)
# 保存设置
driver.find_element_by_link_text("保存设置").click()
time.sleep(2)

# 打印警告框中的信息
print(driver.switch_to.alert.text)

# 通过driver.switch_to.alert()获取警告框,accept()接受警告框
driver.switch_to.alert.accept()

driver.quit()

下拉框.

from selenium import webdriver
from time import sleep
# 导入 Select类(Select类专门定位select标签)
from selenium.webdriver.support.select import Select


driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠标点击“设置”链接
driver.find_element_by_link_text('设置').click()
sleep(1)
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
sleep(2)

# 定位搜索结果显示条数
sel = driver.find_element_by_xpath("//select[@id='nr']")



# <select name="NR" id="nr">

#   <option value="10" selected="">每页显示10条</option>

#   <option value="20">每页显示20条</option>

#   <option value="50">每页显示50条</option>

# </select>

# 以上是该下拉框的源码.value值就在这里找

# select_by_value(value)方法用于定位选项中的value值
Select(sel).select_by_value('50') # 显示50条

driver.quit()

上传文件只需要定位到[上传文件]元素,然后发送文件路径即可

driver.find_element_by_name('file').send_keys("C:/Users/Administrator/Desktop/upload.html")

cookie信息

# 获得cookie信息
cookie= driver.get_cookies()

# 向cookie的name 和value中添加会话信息
driver.add_cookie({'name': 'key-aaaaaaa', 'value': 'value-bbbbbb'})

调用js代码

js="window.scrollTo(100,450);"

# 调用js代码的方法
driver.execute_script(js)

截图方法

driver.get_screenshot_as_file("D:\\baidu_img.jpg")

关闭浏览器

# 关闭单个窗口
driver.close()

# 关闭所有窗口
driver.quit()