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 Réponses :
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")
.
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 :)
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
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é.
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.