搜索

首页  >  问答  >  正文

如何在Selenium中选择一个HTML元素,无论它在哪个框架中

我正在尝试选择一个驻留在 iframe 内并且可能驻留在其他 iframe 中的元素。

是否可以在(python)selenium中的某些(子)iframe中选择一个元素,而无需先选择iframe?有没有办法以某种方式“循环”每个 iframe 并检查在哪里可以找到我的元素...?

在元素、html 内容和 iframe 可能刚刚被加载的情况下如何做到这一点......?

P粉073857911P粉073857911274 天前394

全部回复(2)我来回复

  • P粉571233520

    P粉5712335202024-02-27 10:09:53

    编写自己的递归查找器应该很容易。抱歉,我不懂 python,但在 Java 中它会是这样的:

    public void findInAllFrames(WebElement e, String targetIdStr) {
    
        List l = 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);
        }
    }

    回复
    0
  • P粉794851975

    P粉7948519752024-02-27 10:03:34

    ,无法通过 Selenium,无需切换到相应的 iframe

    原因:

    加载页面时,Selenium 的焦点默认保留在顶部窗口上。 顶部窗口包含其他<iframes>框架集。因此,当我们需要与 iframe 内的 WebElement 进行交互时,我们必须通过以下方法之一切换到相应的 <iframe> :< /p>


    帧切换方法:

    我们可以通过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")))

    参考

    您可以在以下位置找到相关的详细讨论:

    回复
    0
  • 取消回复