2016-05-31 13 views
1

Also ich versuche, einen Rahmen mit Selen auszuwählen. Ich habe viele Beispiele und ähnliche Fragen zu stackoverflow diesbezüglich gefunden.Wählen Sie mit Selen einen Rahmen

Alle von ihnen darauf hingewiesen, dass zum Auswählen von Elementen, die in einem Rahmen sind, Sie zuerst zu diesem Rahmen "bewegen" müssen und dann das gewünschte Element erhalten. Aber ich kann nicht scheinen, den Rahmen zu bekommen, den ich will.

die Post las ich sagte Jegliche Nutzung:

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

So versucht ich sie alle und egal, was ich verwende ich immer eine Fehlermeldung erhalten, die besagt, es nicht den Rahmen, selenium.common.exceptions.NoSuchFrameException: Message: Unable to locate frame: contentfrm finden

Die python-Code:

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

Der HTML-Code:

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

Hinweis: Der Code funktioniert korrekt bis zu dem Punkt, wo ich den Rahmen auswählen muss.

Jede Idee, warum diese

+0

dieser Rahmen hat keinen Inhalt Sind Sie sicher, dass Sie nicht den 'topFrame' wollen? –

+0

@Rafael Es hat tatsächlich Inhalt. Ich habe es einfach nicht aufgenommen, sonst würde es viel Code geben. Aber das Element, das ich suche, ist in diesem Frame – jovaee

+0

zu finden versuchen, Standard Inhalt vor 'switch' Anweisung zu löschen und auch etwas warten, bis das Element ' '' driver.switch_to.frame ("contentfrm"); WebDriverWait wait = neuer WebDriverWait (Treiber, 15); wait.until (ExpectedConditions.elementToBeClickable (By.cssSelector (""))); '' ' –

Antwort

2

Ohne die Website in Frage ist es schwer, genau zu bestimmen, was das Problem ist, aber ich nehme ein paar Annahmen passiert:

  • Ihr Frameset auf die einige Javascript tut Funktion load(), die die Elemente möglicherweise nicht verfügbar machen, wenn Sie versuchen, sie zu finden.

  • Das Rahmenelement Sie bekommen keine src Attribut, so wird es

  • keinen Inhalt haben vielleicht die Auswahl in der Funktion switchto.frame() funktioniert nicht so, wie Sie denken, es tut.

Um sicher zu sein, es ist besser das Element zu warten, sichtbar zu sein, und dann wählen Sie von XPath

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

Wie @Rafael sagte, es besser ist, eine andere Locator zu verwenden, und Sie sollten überprüfen Sie, was das on load() Javascript tut. Ich würde jedoch vorschlagen, die ID des Frames als Locator und nicht einen XPath für den Frame-Namen zu verwenden.

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "contentfrm"))) 
driver.switch_to.frame(element) 
Verwandte Themen