当帧没有id时,如何识别并切换到selenium webdriver中的帧

时间:2013-11-19 11:02:38

标签: testing selenium selenium-webdriver

有谁能告诉我如何识别并切换到只有标题的iframe?

<iframe frameborder="0" style="border: 0px none; width: 100%; height: 356px; min-width: 0px; min-height: 0px; overflow: auto;" dojoattachpoint="frame" title="Fill Quote" src="https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none">

我已尝试过以下代码,但它无效

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));

11 个答案:

答案 0 :(得分:37)

driver.switchTo().frame()有多个重载。

  1. driver.switchTo().frame(name_or_id)
    这里你的iframe没有id或名字,所以不适合你。

  2. driver.switchTo().frame(index)
    这是最后一个选择的选项,因为使用索引不够稳定,你可以想象。如果这是您在页面中唯一的iframe,请尝试driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    最常见的一个。您可以像其他元素一样找到iframe,然后将其传递给方法。

  4. 通过title属性定位它似乎是最好的。

    driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
    // driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@title='Fill Quote']")));
    

答案 1 :(得分:25)

你可以使用cssSelector,

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

答案 2 :(得分:4)

您也可以使用src切换到框架,以下是您可以使用的内容:

driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@src='https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none']")));

答案 3 :(得分:3)

确保在切换到相框之前切换到默认内容:

driver.switchTo().defaultContent();
driver.switchTo().frame(x);

x可以是帧编号,也可以使用driver.findlement并使用您可用的任何选项,例如:driver.findElementByName("Name")

答案 4 :(得分:2)

1)转到html视图

2)输入iframe并找到您需要的帧并计算值并使用

切换到它
oASelFW.driver.switchTo().frame(2); 

如果是第一帧,则使用oASelFW.driver.switchTo().frame(0);

如果是第二帧,则分别使用oASelFW.driver.switchTo().frame(1);

答案 5 :(得分:2)

您可以使用Css Selector或Xpath:

方法1:CSS选择器

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

方法2:Xpath

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@title='Fill Quote']")));

https://seleniumatfingertips.wordpress.com/2016/07/05/handling-frames-in-selenium-webdriver-with-java/

答案 6 :(得分:1)

最简单的方法就是这样。如果它是一个框架,你可以右键单击该字段,如果你看到选项&#34;在选项卡中打开框架&#34;做到这一点。

然后获取框架的URL,这是您使用&#34; driver.get(http://blah blah ..)在Python脚本中放置的内容。

然后Selenium可以找到你的命名元素。这节省了我在这里尝试所有建议的时间,这些建议正在学习但没有工作。我的问题是它在一个框架中。

我正在使用Linux,它为我提供了右键单击选项,可以在另一个选项卡中单独打开框架。我没有使用Windows,所以不知道你是否会在右键菜单中获得该选项。

Ganzarola

答案 7 :(得分:1)

共有三种方法切换到相框

1)Can use id
2)Can use name of the frame
3)Can use WebElement of the frame

2-> driver.switchTo().frame("name of the frame");

答案 8 :(得分:0)

我为此苦了一段时间;一个特别令人沮丧的网站在整个网站中都有多个嵌套框架。我找不到任何方法来识别框架-没有名称,id,xpath,css选择器-没有任何内容。

最终我意识到,帧的编号是最高的,帧是(0),第二是(1)等。

由于我仍然不知道我需要的元素位于哪一帧,我编写了一个for循环,从0开始,循环到50,不断移动到下一帧,并尝试访问所需的元素;如果失败,我会打印一条消息并继续。

在这样的问题上花了太多的时间-_-

driver.switch_to.default_content()
for x in range(50):
    try:
        driver.switch_to.frame(x)
        driver.find_element_by_xpath("//*[@id='23']").click()
        driver.find_element_by_xpath("/html/body/form/table/tbody/tr[1]/td/ul/li[49]/a").click()
    except:
        print("It's not: ", x)
        continue

答案 9 :(得分:0)

我想我可以在这里添加一些内容。

我遇到的情况

  1. 我无法或不容易使用调试工具或检查工具(例如萤火虫)来查看我当前要去的那帧。

  2. 检查工具告诉我的XPATH / CSS选择器等不起作用,因为当前帧不是目标帧。例如我需要先切换到一个子框架,才能从XPATH或任何其他引用访问/定位元素。

简而言之,find_element()find_elements()方法不适用于我的情况。

等待!不完全是

除非我们使用某些漂亮搜索方法。

  

find_elements()contains(@id,"frame")一起使用,以过滤出潜在的

例如

driver.find_elements(By.XPATH,'//*[contains(@id,"frame")]')

然后使用switchTo()切换到该框架,希望这次可以访问目标元素的基础XPATH。

如果像我一样不幸,可能需要对找到的帧进行迭代,甚至在更多层中进行更深的迭代。

例如 这是我用的那一块。

try:
    elf1 = mydriver.find_elements(By.XPATH,'//*[contains(@id,"rame")]')
    mydriver.switch_to_frame(elf1[1])
    elf2 = mydriver.find_elements(By.XPATH,'//*[contains(@id,"rame")]')
    mydriver.switch_to_frame(elf2[2])
    len(mydriver.page_source) ## size of source tell whether I am in the right frame 

我尝试了不同的switch_to_frame(elf1[x]) / switch_to_frame(elf2[x])组合,最后通过在浏览器中的检查工具中找到的XPATH找到了所需的元素。

try:
    element = WebDriverWait(mydriver, 10).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="C4_W16_V17_ZSRV-HOME"]'))
        )
    #Click the link
    element.click()

答案 10 :(得分:0)

我可以用下面的代码解决这个问题

browser.switch_to.frame(browser.find_element_by_tag_name('iframe'))