Нажатие ctrl t не работает в Selenium Webdriver с использованием ActionChains

#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()