如何在定位元素之前等待加载帧?

我正在等待Selenium在等待另一个元素之前切换更改帧。 即

var wait = new WebDriverWait(driver, 15); wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.Id("frameA")); var wait2 = new WebDriverWait(driver, 15); // wait for element within frameA to exist wait2.Until(ExpectedConditions.ElementExists(By.Id("elementA"))); 

如果我抛入一个简单的Thread.Sleep(1000); 在第二次等待之前它运行正常,但没有它我得到以下错误:

 'unknown error: unhandled inspector error: {"code":-32000,"message":"Cannot find context with specified id"} enter code here 

有没有更好的方法等待帧上下文切换完成之后再等待该帧中的元素被填充?

您需要考虑以下几点:

切换到框架的代码行看起来很完美,不会引发任何错误:

 var wait = new WebDriverWait(driver, 15); wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.Id("frameA")); 

在下一行中,您已尝试使用ExpectedConditions方法ElementExists 。 根据API Docs, ElementExists方法定义为:

 An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible. 

在元素可见之前, selenium不能与元素相互作用。 因此,您需要使用方法ElementIsVisible ,如下所示:

 var wait2 = new WebDriverWait(driver, 15); wait2.Until(ExpectedConditions.ElementIsVisible(By.Id("elementA"))); 

您可以等待框架本身可点击:

 wait2.Until(ExpectedConditions.ElementExists(By.Id("YOURFRAMEID"))); 

这是你如何做到的:

 var wait = new WebDriverWait(new SystemClock(), driver, TimeSpan.FromSeconds(timeout), TimeSpan.FromSeconds(sleepInterval)); wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt("yourFrameName"); driver.SwitchTo().Frame("yourFrameName"); 

我不确定你正在使用哪种语言。 但是在C#中,你需要首先切换到默认内容,然后切换到你正在处理的iframe是frameA。 所以这是我建议的代码尝试:

 driver.SwitchTo().DefaultContent(); driver.SwitchTo().Frame(frameA); 

更新:实现一个明确等待元素的方法:

 public void WaitForElementExplicitly(int WaitInMilliSeconds = 3000, By Selector = null) { WebDriverWait wait = new WebDriverWait(CommonTestObjects.IWebDriver, TimeSpan.FromSeconds(WaitInMilliSeconds / 1000)); IWebElement myDynamicElement = wait.Until((d) => { return d.FindElement(Selector); }); } 

然后调用方法等待你的元素

 WaitForElementExplicitly(Selector: By.Id("elementA"));