Невозможно вернуть фокус в главное окно и нажать кнопку отключения - PullRequest
0 голосов
/ 09 января 2020

У меня есть код ниже

После возврата в главное окно не удается получить фокус, и кнопка разъединения не нажимается

parent_handle = driver.window_handles[0]

#clicks on  link
driver.find_element_by_xpath("//*[@id='content']/div[4]/div/p/a").click()

child_handle = [x for x in driver.window_handles if x != parent_handle][0]
driver.switch_to.window(child_handle)

time.sleep(2)

#will work on this winow

driver.close()

driver.switch_to.window(parent_handle)
time.sleep(30)

#click on Disconnect button on toolbar on main window
driver.find_element_by_xpath("//a[contains(text(), 'btn btn-outline-dark  et-disconnect-link et-disconnect-warning-link')]").click()

Я пробовал несколько способов, но получаю ошибку ниже

selenium.common.exceptions.NoSuchElementException: Message: no such element: 
Unable to locate element: {"method":"xpath","selector":"//a[contains(text(), 'btn btn-outline-dark  et-disconnect-link et-disconnect-warning-link')]"}
  (Session info: chrome=79.0.3945.117)

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Кажется, ты почти был там. Вам нужно учесть еще несколько вещей следующим образом:

  • Предполагая, что изначально открыт только один window_handle, вместо parent_handle = driver.window_handles[0] вы можете использовать driver.current_window_handle
  • Как только вы закроете дочернее окно через driver.close(), вы можете использовать switch_to.default_content().
  • btn btn-outline-dark et-disconnect-link et-disconnect-warning-link кажется значением атрибута class.
  • Поскольку ваш сценарий использования должен вызывать click(), вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать следующие Стратегии локатора :

    • Использование CSS_SELECTOR:

      parent_handle = driver.current_window_handle
      #clicks on  link
      driver.find_element_by_xpath("//*[@id='content']/div[4]/div/p/a").click()
      child_handle = [x for x in driver.window_handles if x != parent_handle][0]
      driver.switch_to.window(child_handle)
      #will work on this winow
      driver.close()
      driver.switch_to.window(parent_handle)
      #click on Disconnect button on toolbar on main window
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.btn.btn-outline-dark..et-disconnect-link.et-disconnect-warning-link"))).click()
      
    • Использование XPATH:

      parent_handle = driver.current_window_handle
      #clicks on  link
      driver.find_element_by_xpath("//*[@id='content']/div[4]/div/p/a").click()
      child_handle = [x for x in driver.window_handles if x != parent_handle][0]
      driver.switch_to.window(child_handle)
      #will work on this winow
      driver.close()
      driver.switch_to.window(parent_handle)
      #click on Disconnect button on toolbar on main window
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='btn btn-outline-dark  et-disconnect-link et-disconnect-warning-link']"))).click()
      
    • Примечание : Вы должны добавить следующий импорт:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
0 голосов
/ 09 января 2020

Вы не опубликовали html, но xpath выглядит как классы, а не как текст

driver.find_element_by_xpath("//a[@class='btn btn-outline-dark et-disconnect-link et-disconnect-warning-link')]").click()

Или css_selector

driver.find_element_by_css_selector(".btn.btn-outline-dark.et-disconnect-link.et-disconnect-warning-link").click()

Вы должны также используйте явное ожидание вместо time.sleep(30)

from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait

wait = WebDriverWait(driver, 30)

driver.switch_to.window(parent_handle)
# time.sleep(30) -> remove this
element = wait.until(ec.visibility_of_element_located((By.XPATH, "//a[@class='btn btn-outline-dark  et-disconnect-link et-disconnect-warning-link')]")))
element.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...