#python #selenium #selenium-webdriver #selenium-chromedriver
#python #selenium #selenium-webdriver #selenium-chromedriver
Вопрос:
Мне нужно открыть новую вкладку браузера в моем тесте, и я прочитал, что лучший подход — просто отправить соответствующие ключи в браузер. Я использую Windows, поэтому я использую ActionChains(driver).send_keys(Keys.CONTROL, "t").perform()
, однако это ничего не дает.
Я попробовал следующее, чтобы проверить, Keys.CONTROL
работает ли это правильно:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
def test_trial():
driver = webdriver.Chrome()
driver.get("https://www.google.com/")
ActionChains(driver).send_keys(Keys.CONTROL, "v").perform()
Это действительно передает все, что я скопировал из буфера обмена, в окно поиска Google, которое по умолчанию находится в фокусе.
Это то, что я хочу использовать, но это не работает:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
def test_trial():
driver = webdriver.Chrome()
driver.get("https://www.google.com/")
ActionChains(driver).send_keys(Keys.CONTROL, "t").perform()
Кажется, что с браузером ничего не происходит, не открывается новая вкладка, нет диалогового окна, нет уведомлений. Кто-нибудь знает, почему это так?
Ответ №1:
Попробуйте этот java Script Executor, он должен работать.
link="https://www.google.com"
driver.execute_script("window.open('{}');".format(link))
Edited
код с дескриптором окна.
driver=webdriver.Chrome()
driver.get("https://www.google.com")
window_before = driver.window_handles[0]
link="https://www.google.com"
driver.execute_script("window.open('{}');".format(link))
window_after = driver.window_handles[1]
driver.switch_to.window(window_after)
driver.find_element_by_name("q").send_keys("test")
Комментарии:
1. Спасибо! Могу ли я также спросить, как получить фокус этого нового окна? Он создается, и браузер переключается на него, но все команды, которые я отправляю через webdriver, похоже, выполняются в исходном окне.
2. Попробуйте дескриптор окна.
3. Сейчас я переключаюсь в новое окно, но при попытке взаимодействия с элементами я получаю:
stale element reference: element is not attached to the page document
4.
switch_to.window
Метод работает нормально (я пытался переключиться наwindow_before
), но когда я пытаюсь щелкнуть по элементу в новом окне, я все еще получаю ту же ошибку5. @CrispJam: Я протестировал, а затем опубликовал здесь.
Ответ №2:
попробуйте выполнить этот скрипт:
driver.execute_script("window.open('https://www.google.com');")
например
myURL = 'https://www.google.com'
driver.execute_script("window.open('" myURL "');")
Комментарии:
1. Кажется, это устранило мою проблему, спасибо! Не могли бы вы, пожалуйста, связать меня с документацией по этому поводу? Я никогда не видел, чтобы этот
execute_script
метод использовался, и хотел бы узнать больше о том, как это работает.2. @CrispJam
execute_script
выполняет любой javascript черезWebDriver
. Вы можете прочитать об этом здесь3. Спасибо за ссылку! Следующий вопрос: могу ли я передать URL в переменной вместо строкового литерала? Например, выполнение:
driver.execute_script("window.open(myURL);")
4. @Nihal то, что вы предлагаете в редактировании, похоже, не работает для меня. Теперь у меня есть это:
driver.execute_script("window.open(" address[0] ");")
и я получаю следующую ошибку:SyntaxError: missing ) after argument list
Ответ №3:
Вы получили несколько хороших ответов, используя выполнение JavaScript, но мне любопытно, почему ваш пример не работает в первую очередь.
Возможно, что ваша строка ActionChains выполняется до полной загрузки страницы; вы могли бы попробовать добавить ожидание следующим образом:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
def test_trial():
driver = webdriver.Chrome()
driver.get("https://www.google.com/")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(By.TAG_NAME("body")))
ActionChains(driver).send_keys(Keys.CONTROL, "t").perform()