web-dev-qa-db-fra.com

Comment identifier et basculer vers le cadre dans Selenium WebDriver lorsque le cadre n'a pas d'identifiant

Quelqu'un peut-il me dire comment identifier et basculer vers l'iframe qui n'a qu'un titre?

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

J'ai essayé par le code ci-dessous mais cela ne fonctionne pas 

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

vous pouvez utiliser cssSelector,

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

driver.switchTo().frame() a plusieurs surcharges.

  1. driver.switchTo().frame(name_or_id)
    Ici, votre iframe n’a pas d’identifiant ou de nom, donc pas pour vous.

  2. driver.switchTo().frame(index)
    C’est la dernière option à choisir car l’utilisation d’index n’est pas assez stable comme vous pouvez l’imaginer. S'il s'agit de votre seul iframe dans la page, essayez driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    Le plus commun. Vous localisez votre iframe comme d'autres éléments, puis vous le transmettez à la méthode.

Ici, le localiser par les attributs title semble être le meilleur.

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

Vous pouvez aussi utiliser src pour passer en frame, voici ce que vous pouvez utiliser:

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']")));
4
Shawn Ghavami

Assurez-vous de passer au contenu par défaut avant de passer au cadre:

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

x peut être le numéro d'image ou vous pouvez créer un driver.findlement et utiliser l'une des options disponibles, par exemple: driver.findElementByName("Name").

3
user6147581

Vous pouvez utiliser Css Selector ou Xpath:

Approche 1: Sélecteur CSS

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

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

2
Jackin Shah

1) goto html view 

2) tapez iframe et trouvez votre cadre requis et comptez la valeur et passez-le en utilisant

oASelFW.driver.switchTo().frame(2); 

s'il s'agit de la première image, utilisez oASelFW.driver.switchTo().frame(0); 

si c'est la deuxième image, utilisez respectivement oASelFW.driver.switchTo().frame(1);

2
Ajay

Le moyen le plus simple de procéder est le suivant. Si c'est un cadre, vous pouvez cliquer avec le bouton droit sur le champ et si vous voyez le choix de "ouvrir le cadre dans un onglet", faites-le.

Ensuite, prenez l’URL du cadre et c’est ce que vous avez mis dans votre script Python en utilisant "driver.get ( http: // blah blah ..)

Ensuite, Selenium peut trouver votre élément nommé. Cela m'a épargné des heures d'essayer toutes les suggestions présentées ici, qui portaient sur l'apprentissage mais ne fonctionnaient pas. Le problème avec le mien était qu'il était dans un cadre.

J'utilise Linux, ce qui me donne l'option du clic droit d'ouvrir le cadre, seul, dans un autre onglet. Je n'utilise pas Windows, donc je ne sais pas si vous obtiendriez cette option dans votre menu contextuel.

Ganzarola

1
Ganz

J'ai lutté avec cela pendant un moment; un site Web particulièrement frustrant comportait plusieurs cadres imbriqués sur le site. Je ne pouvais trouver aucun moyen d'identifier les cadres - pas de nom, id, xpath, sélecteur css - rien.

Finalement, j'ai réalisé que les images sont numérotées, le niveau supérieur étant l'image (0), la deuxième image (1), etc.

Comme je ne savais toujours pas dans quel élément l'élément dont j'avais besoin était assis, j'ai écrit une boucle for qui partait de 0 et passait d'un cycle à 50, passant continuellement à l'image suivante et essayant d'accéder à l'élément requis; si cela échouait, je devais imprimer un message et continuer.

J'ai passé trop de temps sur ce problème pour une solution aussi simple -_-

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
0
Bilbo Swaggins