三大等待和三大切換

三大等待

1、三大等待:等待的方式有三種:強制等待,隱性等待,顯性等待。

  • 1、強制等待:time.sleep(2),秒

    • 優點:使用簡單
    • 缺點:等待時間把握不準,容易造成時間浪費或者等待時間不足,不靈活
  • 2、智能等待–在指定時間內(最長時間12,15s),什么時候成立,什么時候不等了

    • 2.1、隱形等待:driver.implicitly_wait(“超時時長-秒”)
      條件:等待一個元素被找到。 找元素都是從html當中去找。find_element,在html當中是存在的。
      特征:在一個瀏覽器會話當中只需要被調用一次,所有的find_element都可以應用。
      如果超時時長以內沒有找著元素,就會拋異常:NosuchElementException的找不到元素的異常。
      優點:全局應用,它適用于WebDriver會話期間中所有查找的Web元素(通過findelement方法)
      缺點:它只支持單一條件:元素存在;只能等待元素存在,不能適用條件
      更復雜的情況,如:元素可點擊、元素可見
    • 2.2、顯性等待:
      注意:條件的參數必須要是元組或者列表的類型的:(元素定位的方法,元素定位表達式)
      WebDriverWait(driver, 超時時間, 輪詢周期默認0.5).until(條件) 直到條件成立 ---- 用這個
      WebDriverWait(driver, 超時時間, 輪詢周期默認0.5).until_not(條件) 直到條件不成立 -用的少
      局部生效,哪里需要等待哪里就要調用,生效只有一次。
      如果超時時長以內沒有找著元素,就會拋異常: TimeoutException,超時異常
      優點:可以設置更加豐富的特定條件
      缺點:僅對指定的元素生效,代碼略復雜 【但是后面框架封裝之后 封裝一次 后面調用】
      presence_of_element_located(元組/列表) :給定的元素存在
      visibility_of_element_located(元組/列表) :給定的元素可見
      element_to_be_clickable(元組/列表) : 給定的元素可點擊

2、元素存在/可見/可用的區別: 元素存在< 可見< 可用

  • 元素的存在: 能find_element就可以了。如果存在但不可見,是可以獲取元素屬性的,但是不能夠對元素進行操作。
    元素的可見: 在存在的基礎上,元素在頁面上大小>0,即在頁面上顯示出來了 肉眼可見。
    比如百度頁面上的設置按鈕,鼠標懸浮上去才會顯示菜單,那么默認情況下 這個元素是存在但不可見的:
    style=‘display:None’; 不可見,這個元素是存在但是不可見。
    style=‘display:block’ 元素展示出來了,存在并且可見。
    元素的可用:在可見的基礎上,能夠使用其原始功能,比如可點擊,可輸入等
    比如按鈕可點擊即可用,不可點擊即不可用。輸入框可輸入即可用,不可輸入即不可用。下拉列表可以選可用

3、find_element和 find_elements

  • find_element — 在頁面當中找到匹配的第一個元素。返回的WebElement對象 【就算元素定位的表達式不唯一,也會返回找到第一個元素】
    如果元素表達式能唯一盡量唯一,如果實在沒有辦法找到唯一的,你也可以使用這個不唯一方法 找到第一個元素。
  • find_elements — 在頁面當中,找到匹配的所有元素。返回的列表。列表當中每個成員都是WebElement對象 --萬不得已的時候可以用,基本上很少用。

4、WebElement類當中定義常用的方法:

  • send_keys() — 輸入 (Keys類定義了鍵盤上除了26個字母和0-9數字外其它的按鍵。)
  • click() — 點擊操作
    text — 獲取元素的文本內容(頁面操作之后某些元素的文本發生變化 或者 拿到這個文本用來做斷言)
  • get_attribute() — 獲取元素的屬性值
  • clear() — 清除內容
  • is_displayed() – 元素是否顯示 結果為布爾值,可以用來做斷言

2、三大切換

元素報錯找不到可能的原因有哪些?【F12里可找到這個元素 但是代碼執行報錯】
1)頁面需要加一些等待
2)窗口切換
3)iframe子頁面
4)頁面有彈框

  • 1、窗口切換
  • 當我們點擊了 a 標簽元素(超鏈接)時,會觸發打開鏈接頁面的事件,有兩種
    情形:
    1、在當前窗口加載新頁面內容
    2、新建一個窗口加載新頁面內容,這種情況在 a 標簽有
    target=“_blank” 時觸發。
    當發生第2種情況時,我們需要切換窗口。在新的窗口里定位元素。
    在這里插入圖片描述

切換的步驟:
1)執行打開新窗口的操作
2)獲取現在所有的窗口句柄。
窗口列表 : wins = driver.window_handles ,結果是個列表,最新的
窗口在列表的最后。
新打開的窗口追加在窗口列表末尾。
通過索引進行選擇: wins[-1]獲取最新的窗口
3)切換到最新窗口:driver.switch_to.window(窗口列表[-1])
切換窗口-參數windowname(窗口的名字 也就是窗口句柄)
需要注意,窗口的句柄并不是固定的,而是由瀏覽器分配的,類似
于進程號: 窗口句柄是唯一,但是并不固定 ,所以不能直接寫死進
行切換。
需要通過獲取到所有句柄后的列表 取值

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver  = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
x_wait_click =(By.XPATH, '//a[contains(text(),"新聞")]')
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(x_wait_click)).click()
#打開新的tab頁,打開新聞的頁面
#第一步:獲取所有的窗口的句柄wins = driver.window_handlesprint(wins[-1])
# 第二步:取值切換新的窗口
driver.switch_to.window(wins[-1])
#//input[@id="ww"]
ww = (By.XPATH,'//input[@id="ww"]')
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located(ww)).send_keys("中國")time.sleep(2)
driver.quit()
  • 2、多窗口切換:
'''
打開新的tab頁,打開新聞的頁面
第一步:獲取所有的窗口的句柄import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver  = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
news =(By.XPATH, '//a[contains(text(),"新聞")]')
map = (By.XPATH,'//a[contains(text(),"地圖")]')
post_par = (By.XPATH,'//a[contains(text(),"貼吧")]')
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(news)).click()
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(map)).click()
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(post_par)).click()
#打開新的tab頁,打開新聞的頁面
#第一步:獲取所有的窗口的句柄wins = driver.window_handles
print(driver.current_url)
print(wins)
ww = (By.XPATH,'//input[@id="ww"]')
for i in wins:if driver.current_url =="https://news.baidu.com/":breakelse:
# 取值切換新的窗口driver.switch_to.window(i)
WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located(ww)).send_keys("中國")time.sleep(2)
driver.quit()
  • 2、iframe切換

      1. iframe是什么?
      • iframe里面放的是另外一個html頁面。頁面嵌套
        driver.find_element的時候,只在當前所在的html當中找元素,不可以
        跨html的。所以,如果我們要操作iframe當中html里的元素,那么必須先切換到iframe當
        中的html當中去
    • 2.如何確認頁面是否有iframe的步驟:

      • 第一個就是:明確元素定位正確且等待到位,依然找不到元素,那么有可能就是在iframe當中。
        第二個就是:在元素定位的時候,查看上方的絕對路徑鏈接,如果其中有2個html,說明在iframe當中
    • 3、iframe切換的方法:driver.switch_to.frame(有2種方式)

      • 第一種:通過iframe元素的name或者id屬性切換: 【QQ空間案例】
        driver.switch_to.frame(“login_frame”)
        注意: 如果id是變化的,也是不可以用于定位的,要換定位方法進
        行定位; 如何確認是變化的,有數字+刷新確認。| 沒有id和name
        屬性,也需要換方法定位并切換。
        第二種:識別你要操作的元素是不是在iframe當中 【126.com案例】
        在這里插入圖片描述
    • 4、iframe退出

      • 退出iframe
        切到子頁面里,有時候需要退回到主頁面里定位,就需要退出iframe:
        driver.switch_to.default_content() — 跳出iframe,回到默認的html當
        中。如果有多層頁面嵌套,一下回到最外層頁面。
        driver.switch_to.parent_frame() : 回到父級頁面中,只能一級一級的
        跳出
        注意:一個主頁面可能會存在多個iframe子頁面,要進去另外一個
        iframe,就需要先退出 再進去另外一個。
  • 3、彈框切換

    • 彈窗切換【alert(警告消息框),confirm(確認消息框),prompt(提示消息對話框) 】

    • 如果頁面發生了彈窗,要點擊彈窗元素,也要進行彈窗切換,不然定位不到元素。
      彈窗有三種不同類型:alert(警告消息框)、confirm(確認消息框)、prompt(提示消息對話框)
      通過switch_to.alert()切換到彈窗
      再使用accept、dismiss、send_keys、text方法進行操作
      1)alert彈框: 本質上是js的彈框 ,需要切換后將它關掉。 ==最常見 優先掌握
      彈框出現后,要點擊確認,才會消失。操作:
      accept(): 點擊確定
      text: 獲取彈框文本
      2)confirm(確認消息框): 確認和取消兩個選項,可以有如下操作:
      dismiss(): 點擊取消
      accept(): 點擊確定
      text: 獲取彈框文本
      3)prompt(提示消息對話框),可以輸入內容。 有如下四種操作:
      dismiss(): 點擊取消
      accept(): 點擊確定
      text: 獲取框中的文本
      send_keys(): 輸入文本
      注意: prompt輸入文本,chrome瀏覽器不支持,Firefox支持,chrome瀏覽器的驅動bug

    • 4、如果元素定位不到,有哪些原因?【no suchelement 如何排查】

      • 1、檢查我們的元素定位表達式是否寫錯,可以F12搜索驗證
        2、檢查是否是需要加等待: 智能等待+ 強制登錄結合使用
        3、檢查是否元素在iframe中,如果是的話就需要切換iframe
        4、檢查元素是否在新的窗口中,如果是的話我們就需要切換窗口
        5、檢查是否有彈框,需要點掉彈框再去定位;
        6、是否元素不可見,先移動鼠標或者其他操作讓你可見后再操作 – 操作鼠標
        7、是否無法直接操作,可以通過js 點擊 或者鍵鼠操作等。 – js點擊 后面會講

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76240.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Lombok @Builder 收參報錯提示沒有無參構造方法的原因與解決辦法

使用Lombok Builder 收參報錯提示沒有無參構造方法的原因與解決辦法 類上加了Builder之后接口接收前端傳來的參數報錯&#xff1a;(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 1.解決辦法…

SAP 查找JOB進程ID

如何查找后臺JOB的進程ID SM37勾選對于JOB

通過C# 將Excel表格轉換為圖片(JPG/ PNG)

Excel 表格可能會因為不同設備、不同軟件版本或字體缺失等問題&#xff0c;導致格式錯亂或數據顯示異常。轉換為圖片后&#xff0c;能確保數據的排版、格式和外觀始終保持一致&#xff0c;無論在何種設備或平臺上查看&#xff0c;都能呈現出固定的樣式&#xff0c;避免了因環境…

Langchain構建RAG對話應用

本文&#xff1a;關注 檢索器與上下文的子鏈、父鏈&#xff1b;即檢索器也需要上下文內容。 RAG是一種增強LLM知識的方法&#xff0c;通過引入額外的數據來實現。 實現思路&#xff1a;加載—》分割—》存儲—》檢索—》生成。 初始化 import os import bs4 from langchain.c…

關于模擬噪聲分析的11個誤區

目錄 1. 降低電路中的電阻值總是能改善噪聲性能 2. 所有噪聲源的噪聲頻譜密度可以相加&#xff0c;帶寬可以在最后計算時加以考慮 3. 手工計算時必須包括每一個噪聲源 4. 應挑選噪聲為ADC 1/10的ADC驅動器 5. 直流耦合電路中必須始終考慮1/f噪聲 6. 因為1/f噪聲隨著頻率降…

vue,uniapp解決h5跨域問題

如果有這樣的跨域問題&#xff0c;解決辦法&#xff1a; ? 第一步&#xff1a;在項目根目錄下創建 vue.config.js 和 package.json 同級目錄。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…

SQL通用語法和注釋,SQL語句分類(DDL,DML,DQL,DCL)及案例

目錄 SQL通用語法和注釋 SQL語句分類&#xff08;DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;TPL&#xff0c;CCL&#xff09; DDL&#xff08;數據定義語言&#xff09; 數據庫操作 查詢&#xff08;SHOW、SELECT&#xff09; 創建&#xff08;CREAT…

Linux:線程概念與控制

??所屬專欄&#xff1a;Linux?? ??作者主頁&#xff1a;嶔某?? Linux&#xff1a;線程概念于控制 var code “d7e241ae-ed4d-475f-aa3d-8d78f873fdca” 概念 在一個程序里的一個執行路線就叫做線程thread。更準確一點&#xff1a;線程是“一個進程內部的控制序列” …

人臉識別聯合行為檢測的辦公管理新模式

基于人臉識別與行為檢測的辦公智能化解決方案 一、背景 在傳統辦公場景中&#xff0c;員工考勤管理、工位使用情況統計、安全監控等環節存在諸多痛點。例如&#xff0c;傳統考勤方式如指紋打卡、刷卡等存在代打卡現象&#xff0c;考勤數據不準確&#xff1b;對于員工是否在工…

ceph weight 和 reweight 的區別

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630

WInform當今技術特性分析

Windows Forms (WinForms) 技術特性分析 引言 Windows Forms (WinForms) 作為微軟最早推出的基于.NET的圖形用戶界面開發框架&#xff0c;已經存在了20多年。在如今充滿了各種現代UI框架的軟件開發生態系統中&#xff0c;WinForms仍然保持著其獨特的地位。本文將深入分析WinF…

Spark rdd算子解析與實踐

一、RDD基礎回顧 RDD&#xff08;Resilient Distributed Dataset&#xff09; 是Spark的核心抽象&#xff0c;代表一個不可變、分區的分布式數據集合。其核心特性包括&#xff1a; 容錯性&#xff1a;通過血緣&#xff08;Lineage&#xff09;記錄數據生成過程&#xff0c;支…

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式數據庫。 所謂嵌入式&#xff0c;就是足夠簡單&#xff0c;可以嵌入到我們自己開發的應用程序之中。 在Linux系統中&#xff0c;sqlite的使用只需要使用它的API&#xff0c;連接它的動態連接庫&#xff0c;甚至都不用連接&#xff0c;sqlite的實現…

Allure測試報告按測試終端和測試類型智能分類查看

以下是實現Allure測試報告按測試終端和測試類型智能分類的完整方案: 一、測試框架分層設計 # 項目結構 project/ ├── api_tests/ # API測試 │ └── test_order.py ├── app_tests/ # 移動端測試 │ ├── android/ │ └── ios/ ├── pc_te…

Spine-Leaf 與 傳統三層架構:全面對比與解析

本文將詳細介紹Spine-Leaf架構&#xff0c;深入對比傳統三層架構&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探討其與Full-mesh網絡和軟件定義網絡&#xff08;SDN&#xff09;的關聯。通過通俗易懂的示例和數據中心網絡分析&#xff0c;我將幫助您理解Spine-L…

圖像預處理-圖像噪點消除

一.基本介紹 噪聲&#xff1a;指圖像中的一些干擾因素&#xff0c;也可以理解為有那么一些點的像素值與周圍的像素值格格不入。常見的噪聲類型包括高斯噪聲和椒鹽噪聲。 濾波器&#xff1a;也可以叫做卷積核 - 低通濾波器是模糊&#xff0c;高通濾波器是銳化 - 低通濾波器就…

安卓手機如何改ip地址教程

對于安卓手機用戶而言&#xff0c;ip修改用在電商、跨境電商、游戲搬磚、社交軟件這些需要開多個賬號的項目。因為多個設備或賬號又不能在同一ip網絡下&#xff0c;所以修改手機的IP地址防檢測成為一個必要的操作。以下是在安卓手機上更改IP地址的多種方法及詳細步驟&#xff0…

對象池模式在uniapp鴻蒙APP中的深度應用

文章目錄 對象池模式在uniapp鴻蒙APP中的深度應用指南一、對象池模式核心概念1.1 什么是對象池模式&#xff1f;1.2 為什么在鴻蒙APP中需要對象池&#xff1f;1.3 性能對比數據 二、uniapp中的對象池完整實現2.1 基礎對象池實現2.1.1 核心代碼結構2.1.2 在Vue組件中的應用 2.2 …

本地部署大模型實現掃描版PDF文件OCR識別!

在使用大模型處理書籍 PDF 時&#xff0c;有時你會遇到掃描版 PDF&#xff0c;也就是說每一頁其實是圖像形式。這時&#xff0c;大模型需要先從圖片中提取文本&#xff0c;而這就需要借助 OCR&#xff08;光學字符識別&#xff09;技術。 像 Gemini 2.5 這樣的強大模型&#x…

《Operating System Concepts》閱讀筆記:p700-p732

《Operating System Concepts》學習第 60 天&#xff0c;p700-p732 總結&#xff0c;總計 33 頁。 一、技術總結 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也稱為 hypervisor。 2.types …