我正在嘗試選擇一個駐留在 iframe 內並且可能駐留在其他 iframe 中的元素。
是否可以在(python)selenium中的某些(子)iframe中選擇一個元素,而無需先選擇iframe?有沒有辦法以某種方式「循環」每個 iframe 並檢查在哪裡可以找到我的元素...?
在元素、html 內容和 iframe 可能剛剛被加載的情況下如何做到這一點...?
P粉5712335202024-02-27 10:09:53
寫自己的遞迴查找器應該很容易。抱歉,我不懂 python,但在 Java 中它會是這樣的:
public void findInAllFrames(WebElement e, String targetIdStr) { Listl = 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); } }
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")))
您可以在以下位置找到相關的詳細討論: