3
votes

Impossible d'ouvrir un nouvel onglet Firefox avec Python et sélénium

J'ai plusieurs profils FireFox et je veux ouvrir un profil, ouvrir quelques onglets avec des URL différentes, ouvrir un autre profil ouvrir des onglets avec des URL. Pour une raison quelconque, send_keys ne semble pas fonctionner, mais window.open le fait. C'est mon code, pour l'instant.

import os
import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
p1 = webdriver.FirefoxProfile(profile_directory="C:/Users/User/AppData/Roaming/Mozilla/Firefox/Profiles/4yopmm8r.py")
driver = webdriver.Firefox(firefox_profile=p1)
driver.get("https://www.reddit.com/")
time.sleep(5)
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + "t")
driver.get("https://www.stackoverflow.com/")

Tout ce qu'il fait, c'est ouvrir reddit, attendre 5 secondes puis ouvrir stackoverflow. Comment résoudre ce problème?


3 commentaires

son firefox qui a besoin de recevoir le signal, pas le corps je pense ... je ne sais pas comment vous feriez ça ... driver.send_keys?


Alors quel est le problème: 1. Il n'accède pas à votre profil sur reddit; ou 2. Le nouvel onglet ne s'ouvre pas, il change simplement l'URL de l'onglet actuel?


@ C.Peck Oui, il s'agit simplement de changer l'URL de l'onglet actuel.


3 Réponses :


0
votes

Essayez d'ouvrir un nouvel onglet en utilisant un script au lieu des touches Ctrl + t , puis changez le focus en utilisant la fonction switch_to_window .

from selenium import webdriver
import time

p1 = webdriver.FirefoxProfile(profile_directory="C:/Users/User/AppData/Roaming/Mozilla/Firefox/Profiles/4yopmm8r.py")
driver = webdriver.Firefox(firefox_profile=p1)
driver.get("https://www.reddit.com/")
time.sleep(5)
# Open a new window
# This does not change focus to the new window for the driver.
driver.execute_script("window.open('');")
time.sleep(3)
# Switch to the new window
driver.switch_to_window(driver.window_handles[-1])
driver.get("https://www.stackoverflow.com/")

ou essayez d'utiliser votre code d'origine, mais utilisez send_keys (Keys.CONTROL + "T") (majuscule) au lieu de send_keys (Keys.CONTROL + "t") .


6 commentaires

Cela fonctionne, mais ce n'est pas ce dont j'ai besoin. Pour une raison quelconque, sur FireFox, cela ouvre un tout nouveau navigateur , pas un nouveau onglet . J'ai aussi besoin d'ouvrir des onglets pour garder un peu d'ordre


Pourquoi passez-vous à `window_handles [ -1 ]?


@ C.Peck window_handles [-1] fait référence à la dernière fenêtre créée. Vous pouvez utiliser des window_handles [0] qui font référence à la première fenêtre, etc.


bon à savoir, merci


@kufte, dans votre code d'origine, après send_keys , veuillez ajouter time.sleep puis switch_to_window avant d'obtenir une nouvelle URL. De plus, si vous utilisez mac, utilisez Keys.COMMAND au lieu de Keys.CONTROL .


en regardant le répertoire des profils je pense à windows :)



0
votes

Si CTRL + t ne fonctionne pas pour vous, essayez ce qui suit:

new_window = [x for x in windows_after if x != windows_before][0]
driver.switch_to_window(new_window)

Ensuite, si vous souhaitez revenir à l'onglet d'origine,

driver.get("https://www.reddit.com/")
windows_before  = driver.current_window_handle
driver.execute_script("window.open('https://www.stackoverflow.com/')")
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
windows_after = driver.window_handles


0 commentaires

0
votes

Vous pouvez ouvrir l'onglet en utilisant le execute_script . Voici l'exemple de code.

# base tab
driver.switch_to.window(driver.window_handles[0])
# second tab
driver.switch_to.window(driver.window_handles[1])
# latest tab
driver.switch_to.window(driver.window_handles[-1])

Autre moyen d'accéder à l'onglet par index En utilisant driver.window_handles , qui vous donnera la liste de fenêtres. Vous pouvez maintenant choisir les onglets par index (commence par 0)

#navigate to reddit in base tab
driver.get("https://www.reddit.com/")
time.sleep(5) # actually you can wait for one of the element present status.
base_tab = driver.window_handles[0]

#open the new tab and navigate to SO
driver.execute_script("window.open('https://www.stackoverflow.com/')")
latest_tab = driver.window_handles[-1]

# use .swith_to.window to access the desired tab
driver.switch_to.window(base_tab)
driver.switch_to.window(latest_tab)

Il est important de s'assurer que la première fenêtre est complètement chargée avant d'ouvrir le nouvel onglet, sinon le window_handles ne le fera pas correspondre à l'ordre que vous attendez. Parce que window_handles ne considérera l'onglet qu'une fois qu'il sera complètement chargé.


0 commentaires