en el controlador web de selenium cómo elegir el iframe correcto

Estoy tratando de hacer clic en un elemento en esta página:

url = 'https://finance.yahoo.com/quote/GOOG?ltr=1' driver = webdriver.Firefox() driver.get(url) driver.find_element_by_link_text('Financials') 

En este punto, me gustaría hacer clic en ‘Flujo de efectivo’, ‘Hoja de balance’ o ‘Trimestral’. Sé que estos botones se han cargado porque puedo extraerlos usando BeautifulSoup de la fuente de la página. Pero cuando bash hacerlo utilizando Selenium:

 driver.find_element_by_link_text('Cash Flow') driver.find_element_by_link_text('Balance Sheet') driver.find_element_by_link_text('Quarterly') 

Todos devuelven “No se puede ubicar el elemento”, excepto “Trimestral”, que devuelve un elemento, pero es el que está encima del gráfico y no el que está arriba de la tabla, que es lo que me interesa.

Creo que esto se debe a que está en el iframe incorrecto, y he localizado todos los iframes:

 driver.find_elements_by_tag_name('iframe') 

que devuelve 9 elementos. Pero tengo problemas para determinar a qué marco pertenecen los elementos que quiero hacer clic. También revisé los iframes de forma secuencial y aún no pude encontrar los elementos que me interesan.

Acabo de verificar el sitio web, ellos (los elementos que busca) NO están en ninguna etiqueta de iframe .

El siguiente código funcionó para mí (cambiado a xpath, no es necesario cambiar):

 driver.find_element_by_xpath("//span[contains(text(),'Cash Flow')]").click() driver.find_element_by_xpath("//span[contains(text(),'Balance Sheet')]").click() driver.find_element_by_xpath("//span[contains(text(),'Quarterly')]").click() 

Nota: Podría ser la razón por la que en “Finanzas”, la etiqueta principal es a que representa un enlace, pero para otros elementos (Flujo de efectivo, Hoja de balance), la etiqueta principal es div que no es una etiqueta de enlace. por lo que find_element_by_link_text no se ha trabajado.


Cambiando entre iframes:

Debe cambiar al marco en el que está presente el elemento antes de que intentemos identificarlo.

Supongamos que su elemento está dentro de 3 iframes de la siguiente manera:

  balance sheet>    

Ahora, si desea identificar CashFlow que está dentro de los tres iFrames:

  driver.switch_to_frame(driver.find_element_by_name("frame1")) // here, you can provide WebElement representing the iFrame or the index. driver.switch_to_frame(driver.find_element_by_name("frame2")) driver.switch_to_frame(driver.find_element_by_name("frame3")) driver.find_element_by_link_text("CachFlow") # switch to default frame before you again try find some other element which is not in the same frame (frame3) driver.switch_to_default_content() # then navigate to the frame that you want to indentify the element: driver.switch_to_frame(driver.find_element_by_name("frame1")) driver.switch_to_frame(driver.find_element_by_name("frame2")) driver.find_element_by_link_text("balance sheet") # switch to default content again driver.switch_to_default_content() 

Nota: usé Referencias de cuadros en lugar de índices, como mencionaste, hay 9 iFrames. Entonces, usar índices sería confuso. Si no puede identificar frameElement, entonces solo vaya a los índices.

Referencia:

  1. http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.switch_to_frame

necesita cambiar para corregir el iframe – todos ellos tienen diferentes ID (o algunas otras tags) en java, se ve así (para algunos ID de iframe aleatorios)

 driver.switchTo().frame(driver.findElementById("defaultdestFB2-1")) 

Sí, esto ayudó a resolver el problema. Muchas gracias. Había 2 cuadros en esta página web (0) y (1). Agregué la línea “driver.switch_to.frame (1)”. A continuación se muestra una copia del código que usé y solucionó el problema que encontré …

 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities #create capabilities capabilities = DesiredCapabilities.INTERNETEXPLORER #delete platform and version keys capabilities.pop("platform", None) capabilities.pop("version", None) #start an instance of IE driver = webdriver.Ie(executable_path="C:\\LocalDev\\IEDriverServer.exe", capabilities=capabilities) #open Accela login page driver.get("https://pwms-avdev.co.arapahoe.co.us/security/hostSignon.do?signOff=true") driver.switch_to.frame(1) #enter Agency agency = driver.find_element_by_id("servProvCode") agency.send_keys('arapahoe')