我在这个 Java 问题上遇到了同样的问题(未解决,顺便说一句),但在 C# 上: 使用 iFrame 打开新窗口后测试用例运行速度非常慢
我要切换到的 iframe:
<iframe id="iframeXYZ" width="100%" height="2280px" frameborder="0" src="/Pages/Abc.html">
</iframe>
选择此 iframe 的代码:
var frameXYZ = driver.FindElement(By.Id("IdOfMyFrame"));
driver.SwitchTo().Frame(frameXYZ);
//I do my stuff here, then return to the main frame
driver.SwitchTo().DefaultContent();
该类没有任何
Thread.Sleep
,甚至没有显式/隐式等待。
我遇到了这个信息,但即使使用 iframe 的 ID,它也没有帮助:
webdriver.switchTo().frame() 方法可以采用名称或 ID。它会 必须在 DOM(文档对象模型)中搜索名称或 id。你可以 页面上有多个具有相同名称属性的内容。所以使用id 属性往往会更快。但是,如果计算机运行浏览器 速度很慢并且/或者 DOM 中有很多属性,可能需要花费一些时间 同时切换帧。
还有一个 webdriver.switchTo().frame() 方法需要一个索引。 所以如果你知道它是第 1 帧你可以使用 webdriver.switchTo().frame(1)。但如果帧的顺序可能会改变 这没有帮助。您还可以使用 WebElement 来切换框架。所以 有时 webdriver.findElement() 方法会更快地找到框架 切换到这个 WebElement 会更快。
这确实需要更多地优化代码以使其更快。
字体:https://grokbase.com/t/gg/webdriver/15bh2n599f/switching- Between-frames-is-very-slow
我想知道这个问题是否与Chrome浏览器本身有关,以及是否没有最终的解决方案。
我使用Python并且可以阅读
switch_to.frame()
代码
运行的主代码行是
self._driver.execute(Command.SWITCH_TO_FRAME, {"id": frame_reference})
所以减慢时间是尝试 find_element() 的时间
最快的代码是传入框架的WebElement
driver.switch_to.frame( driver.find_element('//*[@name="yourframename"]') )
完整代码位于
.../.venv/lib/python3.11/site-packages/selenium/webdriver/remote/switch_to.py
def frame(self, frame_reference: Union[str, int, WebElement]) -> None:
if isinstance(frame_reference, str):
try:
frame_reference = self._driver.find_element(By.ID, frame_reference)
except NoSuchElementException:
try:
frame_reference = self._driver.find_element(By.NAME, frame_reference)
except NoSuchElementException as exc:
raise NoSuchFrameException(frame_reference) from exc
self._driver.execute(Command.SWITCH_TO_FRAME, {"id": frame_reference})