ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

四、UI自动化元素等待

2022-05-24 18:04:24  阅读:183  来源: 互联网

标签:webdriver 元素 driver element click UI 自动化 import find


元素等待

隐式等待

  • 定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
  • 如果超时还没有找到指定元素,则抛出异常NoSuchElementException。
driver.implicitly_wait(5) # 单位: 秒
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.maximize_window()

driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
# 在login.html网页中, 如果能定位到元素, 马上定位, 如果定位不到, 就会等待10秒
# 10秒钟再次定位, 如果还定位不到, 抛出异常NoSuchElementException
driver.implicitly_wait(10)
driver.find_element(By.ID, "username").send_keys("13912121212")
driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.ID, "verify_code").send_keys("8888")
driver.find_element(By.NAME, "sbtbutton").click()
# implicitly_wait针对的不是浏览器本身等待, 只是针对具体的网页

driver.get("http://hmshop-test.itheima.net/")
driver.implicitly_wait(10)
driver.find_element(By.LINK_TEXT, "登录")

driver.quit()

显式等待

  • 定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待
  • 如果不能定位到该元素,则间隔指定时间后再去定位元素
  • 如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
import time

driver = webdriver.Chrome()
driver.maximize_window()

driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
wait = WebDriverWait(driver, 10, 1) # 在driver对象里等待, 一共等10秒, 每隔1秒定义一次元素
element = wait.until(lambda x: x.find_element(By.ID, "username"))
element.send_keys("13912121212")
element = wait.until(lambda x: x.find_element(By.ID, "password"))
element.send_keys("123456")
element = wait.until(lambda x: x.find_element(By.ID, "verify_code"))
element.send_keys("8888")
element = wait.until(lambda x: x.find_element(By.NAME, "sbtbutton"))
element.click()
# wait.until(lambda x: x.find_element(By.NAME, "sbtbutton")).click()
time.sleep(5)

driver.quit()

区别

  • 隐式等待会在WebDriver对象实例的整个生命周期起作用,不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。
  • 缺点:当页面某些元素无法加载,但是想找的元素已经出来了,它还是会继续等待。
  • 显示等待是针对页面中具体元素的, 只要指定元素加载完成, 即使页面中还有其他元素无法加载, 就不在继续等待

一个封装显式等待的案例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
import time

def get_element(driver, by, elementname):  # 通过显式等待定位一个元素
    wait = WebDriverWait(driver, 5, 0.5) # 一共等5秒, 每隔0.5秒定义一次元素
    try:
        return wait.until(lambda x: x.find_element(by, elementname))
    except TimeoutException:
        print(f"元素{elementname}没有找到")
        return None

def element_send_keys(driver, by, elementname, key):
    element = get_element(driver, by, elementname)
    if element is not None:
        element.send_keys(key)

def element_click(driver, by, elementname):
    element = get_element(driver, by, elementname)
    if element is not None:
        element.click()

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
element_send_keys(driver, By.ID, "username", "13912345678")
element_send_keys(driver, By.ID, "password", "123456")
element_send_keys(driver, By.ID, "verify_code", "8888")
element_click(driver, By.NAME, "sbtbutton1")

time.sleep(5)

driver.quit()

框架与窗口切换

框架的解释

  • 一个html中可以嵌套其他的html
    • 一个html中嵌套另一个html,必须使用iframe标签
<html>
    <iframe>
    	<html>
    	</html>
    </iframe>
</html>

frame切换

  • 使用步骤
    • driver.switch_to.frame(定位到的框架元素) # 切换框架
    • driver.switch_to.default_content() # 恢复到默认页面
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://hmshop-test.itheima.net/index.php/Admin/Admin/login")
driver.maximize_window()
driver.find_element(By.NAME, "username").send_keys("admin")
driver.find_element(By.NAME, "password").send_keys("123456")
driver.find_element(By.NAME, "vertify").send_keys("8888")
driver.find_element(By.CSS_SELECTOR, "input[value='登录']").click()
time.sleep(3)
driver.find_element(By.LINK_TEXT, "会员").click()
driver.find_element(By.LINK_TEXT, "会员列表").click()
# 定位到frame
frm = driver.find_element(By.ID, "workspace")
# 切换frame
driver.switch_to.frame(frm)
# 添加会员按钮, 是嵌套在一个frame中的html
driver.find_element(By.LINK_TEXT, "添加会员").click()

# 从frame里面还原到外面的html中定位
driver.switch_to.default_content()
driver.find_element(By.LINK_TEXT, "订单").click()
driver.find_element(By.LINK_TEXT, "订单日志").click()
time.sleep(5)
driver.quit()

窗口切换

  • handles = driver.window_handles # 获取所有窗口句柄
  • driver.switch_to.window(handles[index]) # index为要切换窗口的下标, 第一个窗口下标为0
# 登录首页, 点击珠宝导航, 打开珠宝列表页, 点击第一个商品, 进入商品详情页
driver.get("http://tpshop.com")
element = driver.find_element_by_link_text("珠宝")
element.click()
handles = driver.window_handles # 获取所有窗口句柄
driver.switch_to.window(handles[1]) # 打开第二个窗口
element = driver.find_element_by_class_name("xs_img")
element.click()
  • 切换窗口的常用技巧
from selenium import webdriver
import time
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("http://hmshop-test.itheima.net/")
driver.maximize_window()
driver.find_element(By.LINK_TEXT, "华为").click()
time.sleep(1)
driver.switch_to.window(driver.window_handles[-1]) # 切换到最后一个窗口
driver.close() # 把最后一个窗口关闭
time.sleep(3)
driver.switch_to.window(driver.window_handles[0]) # 切换到第一个窗口
driver.find_element(By.LINK_TEXT, "小米").click()
driver.find_element(By.LINK_TEXT, "三星").click()
driver.find_element(By.LINK_TEXT, "冰箱").click()

# 不知道有几个窗口, 显示所有窗口的标题
for n in driver.window_handles:  # 遍历所有窗口
    driver.switch_to.window(n)
    print(driver.title)

time.sleep(5)
driver.quit()

截图

  • driver.get_screenshot_as_file(图片文件路径)
    • 首选png格式, jpg也能保存, 但会提示warning
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("http://hmshop-test.itheima.net/")
driver.find_element(By.LINK_TEXT, "注册").click()
time.sleep(2)
driver.get_screenshot_as_file("a.png")  # 代码执行到这一刻, 浏览器的状态截图
driver.quit()

总结

image

标签:webdriver,元素,driver,element,click,UI,自动化,import,find
来源: https://www.cnblogs.com/mengbingpeng1010/p/16306490.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有