2016-05-31 58 views
1

所以我試圖選擇一個使用硒的幀。我在這裏找到了很多關於stackoverflow的例子和類似的問題。使用Selenium來選擇一個幀

他們都指出,要選擇框架中的元素,首先必須「移動」到該框架,然後獲取所需的元素。 但我似乎無法得到我想要的框架。

所有我看到的帖子說使用:

driver.switch_to.frame("contentfrm") # Fetch by name, or 
driver.switch_to.frame(1) # Fetch by index 

所以我會嘗試所有這些,不管我用我總是得到的是說,它無法找到幀錯誤,selenium.common.exceptions.NoSuchFrameException: Message: Unable to locate frame: contentfrm

的Python代碼:

from selenium import webdriver 

from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 

driver.get("http://10.0.0.2/html/content1.asp") 
driver.get("10.0.0.2") 

elem = driver.find_element_by_name("Username") 
elem.send_keys("admin") 

elem = driver.find_element_by_name("Password") 
elem.send_keys("admin2") 

elem.send_keys(Keys.ENTER) 

# ---- 
driver.switch_to.default_content() 
driver.switch_to.frame("contentfrm") 
# elem = driver.find_element_by_id("m8") 

# driver.quit() 

的HTML代碼:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>Quick Start</title> 
</head> 

<frameset onload="load()" rows="0,*" frameborder="0" border="0" framespacing="0"> 
    <frame name="topFrame" scrolling="no" src="../main/refresh.asp" __idm_frm__="200"></frame> 
    <frame name="contentfrm" id="contentfrm" __idm_frm__="201"></frame> 
</frameset> 

</html> 

注:該代碼正常工作到我必須選擇框架的位置。

任何想法,爲什麼這種情況正在發生

+0

該框架沒有內容你確定你不希望'topFrame'? –

+0

@Rafael它確實有內容。我只是沒有包括它,否則會有很多代碼。但我期望得到的元素位於該框架 – jovaee

+0

嘗試刪除'switch'語句之前的默認內容,並且還需要一些等待時間才能找到元素 ''' driver.switch_to.frame(「contentfrm」); WebDriverWait等待=新的WebDriverWait(驅動程序,15); wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(「」))); ''' –

回答

2

沒有網站的問題,這是很難確定的問題是什麼,但我會採取一些假設:

  • 你的框架做一些JavaScript的功能load()這可能會使元素在您嘗試找到它們時不可用。

  • 你得到的幀元素沒有 src屬性,因此不會有任何內容

  • 也許在功能switchto.frame()選擇不工作,你覺得它的方式。

爲了安全起見,最好等待元素是可見的,然後與XPath選擇它

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//frame[@name='contentfrm']")) 
) 
driver.switch_to.frame(element) 
1

正如@Rafael說,最好是使用不同的定位,你應該檢查什麼是加載()JavaScript正在做什麼。不過,我會建議使用框架的id作爲定位器,而不是框架名稱的xpath。

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "contentfrm"))) 
driver.switch_to.frame(element) 
相關問題