有谁能告诉我如何识别并切换到只有标题的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")));
答案 0 :(得分:37)
driver.switchTo().frame()
有多个重载。
driver.switchTo().frame(name_or_id)
这里你的iframe
没有id或名字,所以不适合你。
driver.switchTo().frame(index)
这是最后一个选择的选项,因为使用索引不够稳定,你可以想象。如果这是您在页面中唯一的iframe,请尝试driver.switchTo().frame(0)
driver.switchTo().frame(iframe_element)
最常见的一个。您可以像其他元素一样找到iframe,然后将其传递给方法。
通过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']")));
答案 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)
我想我可以在这里添加一些内容。
我无法或不容易使用调试工具或检查工具(例如萤火虫)来查看我当前要去的那帧。
检查工具告诉我的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'))