[FIXED] selenium python iframe erhält https-Anfragen

Ausgabe

Ich verwende Selen mit Python, ich möchte alle https-Anforderungen vom iframe-Element erhalten. Hier bekomme ich das Iframe-Element und nachdem ich eine Zeile aus der Tabelle ausgewählt und die Schaltfläche gedrückt habe, wird die HTTP-Post-Anfrage gestartet.

Teil meines Codes

Chrome-Treiber definieren

 chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument('--auto-open-devtools-for-tabs')
chrome_options.add_argument('--log-level=2')
chrome_options.add_argument('--disable-features=IsolateOrigins,site-per-process')
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])


capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = {"performance": "ALL",'browser':'ALL','server':'ALL'}  # chromedriver 75+
capabilities["goog:chromeOptions"] = {"w3c": "false","args": "%w[headless window-size=1280,800]"}  # chromedriver 75+
capabilities['acceptSslCerts'] = True
capabilities['acceptInsecureCerts'] = True
capabilities['PageLoadStrategy'] = None

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options,desired_capabilities=capabilities)
driver.get(os.environ['URL'])

Holen Sie sich das Iframe-Element und klicken Sie auf die Zeilentabelle

  WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//*[@id="myiframe"]')))
row_selector = '//*[@id="root"]/div/div/div/div[2]/div[2]/div/div/div/div/table/tbody/tr[1]/th[3]'
row_selector_clickable = '//*[@id="root"]/div/div/div/div[2]/div[2]/div/div/div/div/table/tbody/tr[1]/th[3]/div/div/div[2]/div/button'

WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, row_selector)))
actions = ActionChains(driver)
row_element = driver.find_element(By.XPATH, row_selector)
row_clickable = driver.find_element(By.XPATH, row_selector_clickable)
actions.move_to_element(row_element)
actions.click(row_clickable)
actions.perform()

dann bekomme ich hier alle HTTP-Post-Anforderungen und schreibe sie in eine Datei

 logs = driver.get_log("performance")
def process_browser_logs_for_network_events(logs):
    """
 Return only logs which have a method that start with "Network.response", "Network.request", or "Network.webSocket"
 since we're interested in the network events specifically.
 """
    for entry in logs:
         log = json.loads(entry["message"])["message"]
         yield log


events = process_browser_logs_for_network_events(logs)
li = []
with open(f"log_entries-{datetime.datetime.now()}.txt", "wt") as out:
    for event in events:
        print(event)
        if 'method' in event.get('params', {}).get('request', {}) and event.get('params', {}).get('request',
                                                                                                  {}).get('method',
                                                                                                          '') == 'POST':
            li.append(event)


    out.write(json.dumps(li))

Aber das Problem ist, dass es mir Anfragen von der ersten Seite zeigt, denke ich, selbst wenn ich zu iframe wechsle und es mir die richtigen Elemente aus iframe auswählt. Der Ablauf ist so:
Ich melde mich bei der Website an, dann leite ich zur Hauptseite weiter und dann klicke ich auf die Schaltfläche und öffne einen neuen Tab und dort habe ich den Iframe, ich schalte den Iframe um, drücke auf eine Zeile in der Tabelle und es gibt eine HTTP-Anfrage Das dauert 5-10 Sekunden (in dieser Zeit ist der Status “Ausstehend”), wenn es erfolgreich ist, wird es zur Google Mail-Website weitergeleitet und die http-Anforderung ist verschwunden, weil die Weiterleitung, also habe ich versucht, Protokolle hinzuzufügen, aber immer noch.

Ich kann die https-Anfragen nicht offenlegen, weil es mein Job ist, aber was ich sehe, sind Anfragen von der ersten Seite und nicht vom aktuellen Iframe.

Lösung

Ok, ich werde versuchen, so klar wie möglich zu sein: Selenium-Setup unten ist Linux/Selenium/Chrome, Sie können es an Ihre eigenen anpassen, beobachten Sie einfach die Importe und den Code, nachdem Sie den Browser/Treiber definiert haben.

Zum Abfangen von Browseranfragen habe ich Selenium-Wire verwendet: https://pypi.org/project/selenium-wire/

Wenn Sie möchten, können Sie das native Abfangen von Selen-Anforderungen verwenden.

Ich habe mich nach einer Beispielwebsite umgesehen, die einen Iframe enthält, mit dem Sie interagieren, dh auf eine Schaltfläche klicken (OP hätte die Beinarbeit leisten und ein solches Beispiel bereitstellen sollen, aber trotzdem).

Code:

from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time as t
from datetime import datetime

chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("window-size=1280,720")
webdriver_service = Service("chromedriver/chromedriver") ## path to where you saved chromedriver binary
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)

url = 'https://fasecolda.com/ramos/automoviles/historial-de-accidentes-de-vehiculos-asegurados/'
browser.get(url)
for x in browser.requests:
    print('URL:', x.url)
    print('ORIGIN:', x.headers['origin'])
    print('HOST:', x.headers['Host'])
    print('SEC-FETCH-DEST:', x.headers['sec-fetch-dest'])
    print('TIMESTAMP:', x.date)
    print('______________________________________')

WebDriverWait(browser, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//*[@title='Términos']")))
t.sleep(3)
print('switched to iframe')
button = WebDriverWait(browser,5).until(EC.element_to_be_clickable((By.XPATH, '//*[text()="Acepto los Términos y Condiciones"]')))
print('located the button, bringing it into view')
button.location_once_scrolled_into_view
print('now waiting 30 seconds, for clear separation of requests')
t.sleep(30)
print('printing last request again:')
print('URL:', browser.last_request.url)
print('ORIGIN:', browser.last_request.headers['origin'])
print('HOST:', browser.last_request.headers['Host'])
print('SEC-FETCH-DEST:', browser.last_request.headers['sec-fetch-dest'])
print('TIMESTAMP:', browser.last_request.date)
last_date = browser.last_request.date

print('clicked the button at', datetime.now())
button.click()
print('waiting another 30 seconds')
t.sleep(30)
print('and now printing the requests again (the ones after interacting with iframe)')
for x in browser.requests:
    if x.date > last_date:
        print('URL:', x.url)
        print('ORIGIN:', x.headers['origin'])
        print('HOST:', x.headers['Host'])
        print('SEC-FETCH-DEST:', x.headers['sec-fetch-dest'])
        print('TIMESTAMP:', x.date)
        print('______________________________________')

Wie Sie sehen können, ist es ziemlich einfach:

  • gehen Sie zur Webseite
  • getätigte Druckanfragen (URL, Ursprung, Host, Sek.-Abrufziel und Zeitstempel)
  • Suchen Sie den Iframe und wechseln Sie zu ihm
  • Suchen Sie die Schaltfläche, auf die Sie klicken möchten, und zeigen Sie sie an
  • Warten Sie 30 Sekunden auf eventuelle Anfragen von JS auf der Seite
  • after 30 seconds, printing last request made (url, origin, host, sec-fetch-dest and timestamp) – also saving the timestamp into a variable, to be able to filter subsequent requests
  • clicking the button and registering the timestamp when we clicked it
  • waiting another 30 seconds, just to make sure all requests were performed
  • printing the requests made after the timestamp variable saved previously

The result in terminal:

[...]
______________________________________
URL: https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fBBc4.woff2
ORIGIN: https://siniestroshava.com.co
HOST: None
SEC-FETCH-DEST: font
TIMESTAMP: 2022-10-08 21:44:44.794670
______________________________________
switched to iframe
located the button, bringing it into view
now waiting 30 seconds, for clear separation of requests
printing last request again:
URL: https://optimizationguide-pa.googleapis.com/v1:GetModels?key=AIzaSyCkfPOPZXDKNn8hhgu3JrA62wIgC93d44k
ORIGIN: None
HOST: None
SEC-FETCH-DEST: empty
TIMESTAMP: 2022-10-08 21:44:57.413952
clicked the button at 2022-10-08 21:45:19.036690
waiting another 30 seconds
and now printing the requests again (the ones after interacting with iframe)
URL: https://siniestroshava.com.co/hava/Seguridad/SolicitarCorreo
ORIGIN: None
HOST: siniestroshava.com.co
SEC-FETCH-DEST: iframe
TIMESTAMP: 2022-10-08 21:45:19.209288
______________________________________
URL: https://siniestroshava.com.co/hava/css/hava/estiloslocales.css
ORIGIN: None
HOST: siniestroshava.com.co
SEC-FETCH-DEST: style
TIMESTAMP: 2022-10-08 21:45:19.633076
______________________________________
URL: https://siniestroshava.com.co/hava/css/vendor.css?v=U1BT8Ls9ntdpDS12L5xpMjmSP3Eitncl_SyDnU5LLHk
ORIGIN: None
HOST: siniestroshava.com.co
SEC-FETCH-DEST: style
TIMESTAMP: 2022-10-08 21:45:19.645382
______________________________________
URL: https://siniestroshava.com.co/hava/css/devextreme/dx.material.hava.css
ORIGIN: None
HOST: siniestroshava.com.co
SEC-FETCH-DEST: style
TIMESTAMP: 2022-10-08 21:45:19.646197
______________________________________
   [...]
    ______________________________________

Wie Sie sehen können, ist die https://fasecolda.comHauptwebsite , und iframe src ist https://siniestroshava.com.co/. Sie können alle seit dem Laden der Originalseite gestellten Anfragen deutlich beobachten (ich habe sie nicht alle gepostet, zu viele), Sie können die letzte Anfrage sehen, die vor der Interaktion mit dem Iframe gestellt wurde, den Zeitstempel der Interaktion mit dem Iframe und die nachfolgende Anfrage – der erste, der gemacht hat SEC-FETCH-DEST: iframe– offensichtlich die Anfrage des iframe, weil wir auf die Schaltfläche geklickt haben. Auch hostund originsind relevante Kopfzeilenschlüssel, falls sie vorhanden sind.

Dies ist eine Methode, um die vom Iframe gestellten Anfragen zu isolieren, im Gegensatz zu denen, die von der Hauptseite gestellt werden.

Ich glaube, das sollte Ihre gestellte Frage beantworten.


Beantwortet von –
Barry der Platipus


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like