我怎样才能选择一个html元素,无论它在selenium中的框架是什么?

时间:2017-12-12 10:19:14

标签: python html selenium selenium-webdriver iframe

我正在尝试选择一个位于iframe内部且可能位于其他iframe中的元素。

在某种程度上可以在(python)selenium中的某个(子)iframe中选择一个元素而不选择之前的iframe吗?有没有办法以某种方式“循环”每个iframe,并检查在哪里找到我的元素......?

如何在案例元素和html内容以及iframe可能只是加载...?

2 个答案:

答案 0 :(得分:4)

,无法与WebElement中的任何 iframe 进行互动,直至 Selenium 无需切换到相应的iframe

原因:

加载网页时,默认情况下 Selenium 的焦点仍保留在 Top Window 上。 Top Window 包含其他 iframes framesets 。因此,当我们需要与iframe中的WebElement进行互动时,我们必须通过以下方法之一切换到相应的iframe

帧切换方法:

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

按框架名称

我们可以切换到iframe的

Name 属性。

示例:

driver.switch_to.frame("iframe_name")

按帧ID

我们可以切换到iframe的

ID 属性。

示例:

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()

切换帧的更好方法:

切换帧的更好方法是在 WebDriverWait 设置为的情况下,针对预期帧的可用性引发 expected_conditions frame_to_be_available_and_switch_to_it 如下:

  • 通过 Frame ID

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID,"id_of_iframe"))
    
  • 通过 Frame Name

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"name_of_iframe"))
    
  • 通过 Frame Xpath

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.XPATH,"xpath_of_iframe"))
    
  • 通过 Frame CSS

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.CSS_SELECTOR,"css_of_iframe"))
    

答案 1 :(得分:3)

编写自己的递归查找器应该很容易。道歉,不懂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);
    }
}