当前位置: 首页 > 知识库问答 >
问题:

如何在selenium中选择html元素,而不管它位于哪个框架中?

羊光辉
2023-03-14

我试图选择一个元素,它驻留在一个iframe中,也可能驻留在其他iframe中。

是否可以在(python)selenium中的某个(子)iframe中选择一个元素,而不必事先选择iframe?是否有一种方法可以在每个iframe上“循环”并检查在哪里可以找到我的元素。。。?

在元素、html内容和iFrame可能即将加载的情况下,如何做到这一点。。。?

共有2个答案

邵骏喆
2023-03-14

编写自己的递归查找器应该很容易。很抱歉,我不懂python,但在Java中,它可能类似于:

public void findInAllFrames(WebElement e, String targetIdStr) {

    List<WebElement> l = e.findElements(By.tagName("iframe"));

    for(int inx=0; inx<l.size(); inx++) {
        List<WebElement> targets = l.get(inx).findElements(By.id(targetIdStr));
        if(targets.size()>0) {
            // Do something with your targets
        }

        findInAllFrames(l.get(inx), targetIdStr);
    }
}
丰佐
2023-03-14

不,如果不切换到相应的iframe,则无法通过Seleniumiframe中的任何WebElement进行交互。

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

我们可以通过3种方式切换到帧。

按帧名称:

Nameiframe的属性,通过它我们可以切换到它。

例子:

driver.switch_to.frame("iframe_name")

按帧ID:

IDiframe的属性,通过它我们可以切换到它。

例子:

driver.switch_to.frame("iframe_id")

按帧索引:

假设页面中有10个帧,我们可以使用索引切换到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(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"))

您可以在以下网站找到相关的详细讨论:

  • iframe下#文档的处理方法

 类似资料:
  • 问题内容: 我正在尝试选择一个位于iframe中并且可能位于其他iframe中的元素。 是否可以在不选择iframe的情况下以某种方式在(python)selenium中的某个(sub)iframe中选择元素?有没有办法以某种方式“遍历”每个iframe并检查在哪里可以找到我的元素…? 以及在元素和html内容以及iframe可能只是被加载的情况下该怎么做…? 问题答案: 不 , 在不切换到各自的

  • 我们的网站上有w2ui下拉元素,我想使用selenium IDE运行脚本进行测试,我记录了步骤,但在运行该脚本时出错(未找到元素)。有没有办法在Selenium IDE(特别是下拉列表)中处理w2ui元素。我尝试过xpath,仍然没有在下拉列表中选择值。

  • 问题内容: 我使用的选择标记的格式允许多次选择,但我希望选择的最大数量为10。使用JavaScript或jquery是否可以? 提前致谢! 问题答案: 这是供您使用的一些完整代码…一定要喜欢Google AJAX API Playground :-) 编辑1: 注意:这只允许您选择5,因为我不想复制/粘贴另外10个选项:-) ​

  • 问题内容: 我们选择带有Django 1.4测试和Selenium的元素,如下所示: (该类继承自)。 问题是有时有些元素没有文本,并且如果我们选择它,它就会失败(len为0)。如何选择没有文本的元素? 更新 :由于不起作用,我不得不断言两行以断言没有文本: 现在,我可以用一行声明相同的内容: 问题答案: 您可以使用XPath的 功能。

  • 我在Selenium中找不到此网站上的复选框 我尝试过:Xpath、ID、类型、操作键、文本和部分文本。我已经能够发送密钥(用户和密码)并找到user/pass元素。 > #检查框-标签-边距 提前谢谢你的帮助,我觉得我好像在兜圈子。

  • https://imgur.com/vfhp8n7.png 当我单击B按钮时,整行隐藏 我需要硒来点击B按钮,然后点击下一个B按钮 我想执行,但是数字4352,6820每次都不一样 你有什么想法吗? 编辑