搜尋

首頁  >  問答  >  主體

如何在Selenium中選擇一個HTML元素,無論它在哪個框架中

我正在嘗試選擇一個駐留在 iframe 內並且可能駐留在其他 iframe 中的元素。

是否可以在(python)selenium中的某些(子)iframe中選擇一個元素,而無需先選擇iframe?有沒有辦法以某種方式「循環」每個 iframe 並檢查在哪裡可以找到我的元素...?

在元素、html 內容和 iframe 可能剛剛被加載的情況下如何做到這一點...?

P粉073857911P粉073857911274 天前398

全部回覆(2)我來回復

  • P粉571233520

    P粉5712335202024-02-27 10:09:53

    寫自己的遞迴查找器應該很容易。抱歉,我不懂 python,但在 Java 中它會是這樣的:

    public void findInAllFrames(WebElement e, String targetIdStr) {
    
        List l = e.findElements(By.tagName("iframe"));
    
        for(int inx=0; inx targets = l.get(inx).findElements(By.id(targetIdStr));
            if(targets.size()>0) {
                // Do something with your targets
            }
    
            findInAllFrames(l.get(inx), targetIdStr);
        }
    }

    回覆
    0
  • P粉794851975

    P粉7948519752024-02-27 10:03:34

    ,無法通過 Selenium,無需切換到對應的 iframe

    原因:

    載入頁面時,Selenium 的焦點預設會保留在頂部視窗上。 頂部視窗包含其他<iframes>框架集。因此,當我們需要與iframe 內的WebElement 進行互動時,我們必須透過以下方法之一切換到對應的<iframe>


    幀切換方法:

    我們可以透過3種方式切換到框架。

    按框架名稱

    Name iframe 的屬性,透過它我們可以切換到它。

    範例:

    driver.switch_to.frame("iframe_name")

    按幀 ID

    iframe的ID屬性,透過它我們可以切換到它。

    範例:

    driver.switch_to.frame("iframe_id")

    按幀索引

    假設頁面有10個frame,我們可以透過索引切換到iframe。

    範例:

    driver.switch_to.frame(0)
    driver.switch_to.frame(1)

    切換回主機

    我們可以使用default_content()#parent_frame()切換回主框架

    範例:

    driver.switch_to.default_content()
    driver.switch_to.parent_frame()

    切換框架的更好方法:

    切換框架的更好方法是透過將expected_conditions 設定為frame_to_be_available_and_switch_to_it##WebDriverWait# 以獲得預期框架的可用性,如下所示:

    • 透過幀 ID

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID,"id_of_iframe"))
    • 透過框架名稱

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"name_of_iframe")))
    • 透過框架Xpath

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"xpath_of_iframe")))
    • 透過框架CSS

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"css_of_iframe")))

    參考

    您可以在以下位置找到相關的詳細討論:

    回覆
    0
  • 取消回覆