如何在硒中等待iframe页面加载?



我有一个包含iframe标签的页面,并希望捕获内容是否已完全加载到iframe中。

我使用time.sleep和检查document.readyState,它在理想情况下工作得很好;来自Web服务器的强大和快速响应。但这似乎不能保证所有情况,我想改进我的代码。

请告诉我一些建议或提示。 谢谢。

我的环境

  • 操作系统 : 视窗 7 x64
  • 铬 : 68.0.3440.106 (官方, 64位(
  • 蟒蛇:3.6.6
  • 硒 : 3.14.0

我参考以下文件。

  • 如何等待页面在Python Selenium中加载
  • 等待页面加载在硒
  • 硒 - 如何等到页面完全加载

我在下面写了代码

def wait_for_document(self, driver):
time.sleep(3)
for i in range(20):
if driver.execute_script("return document.readyState") == "complete" : return
else : time.sleep(1)

尝试下面的代码等待iframe并切换到它以便能够处理内部节点:

from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.by import By
driver = webdriver.Chrome() 
driver.get(URL) 
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("iframe_name_or_id"))

您可以iframe作为 WebElement 传递,而不是"iframe_name_or_id"

wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath('//iframe')))

要等待框架内的元素存在:

wait(driver, 10).until(EC.presence_of_element_located((By.ID, "Element ID")))

您还可以使用By.NAMEBy.CLASS_NAMEBy.XPATH等。

更多关于 ExplicitWait

您需要将硒执行更改为 iframe,并在之后检查加载的 url。

例:

$frame = $selenium->findElement(WebDriverBy::id('iframe'));
$selenium->switchTo()->frame($frame);
if (strstr($selenium->getCurrentURL(), "my_url") !== FALSE) {
do stuff...
}
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
browser = webdriver.Chrome('/path/to/driver')
browser.get('http://your/url')
try:
myElem = WebDriverWait(browser, delay).until(expected_conditions.presence_of_element_located((By.ID, 'id of iframe or whatever')))
except TimeoutException:
# error
#page is loaded
you could use this method to  wait for page to fully load:-
public  boolean waitForJStoLoad() {
WebDriverWait wait = new WebDriverWait(driver, 50);
JavascriptExecutor js = (JavascriptExecutor) driver;
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
return ((Long)js.executeScript("return jQuery.active") == 0);
}
catch (Exception e) {
return true;
}
}
};
// wait for Javascript to load
ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
return js.executeScript("return document.readyState")
.toString().equals("complete");
}
};
return wait.until(jQueryLoad) && wait.until(jsLoad);
}

最新更新