Selenium 在 iframe 之间切换非常慢

问题描述 投票:0回答:1

我在这个 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浏览器本身有关,以及是否没有最终的解决方案。

c# performance selenium iframe webdriver
1个回答
0
投票

我使用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})
© www.soinside.com 2019 - 2024. All rights reserved.