Как нажать на иконку в селене python - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь сделать выход на веб-странице по селену и python, и в настоящее время не повезло. Чтобы выйти из системы, мне нужно щелкнуть ссылку в правом верхнем углу веб-страницы, и у нее откроется небольшое раскрывающееся окно, а затем я могу щелкнуть значок «Выход из системы» внутри этого раскрывающегося списка. окно. Вот изображение этого выпадающего окна. enter image description here

И код проверки для этого значка выхода из системы в раскрывающемся окне.

enter image description here

Теперь в моем коде python мне удалось открыть раскрывающееся окно, но если бы я должен был щелкнуть значок выхода из системы Я продолжаю получать исключение "selenium.common.exceptions.ElementNotVisibleException".

Вот мой код:

try:
    # to click the link so that the drop-down window opens 
    action = ActionChains(self.driver)
    dropdownwindow= self.driver.find_element_by_xpath("//span[@class='ssobanner_logged']/img")
    action.move_to_element(dropdownwindow).perform()
    dropdownwindow.click()

    # try to click the logout icon in the drop-down so that user may logout 
    logoutLink = self.driver.find_element_by_xpath(
        "//*[@id='ctl00_HeaderAfterLogin1_DL_Portals1']/tbody/tr/td[4]/a/img")
    action.move_to_element(logoutLink).perform()
    logoutLink.click()
    return True
except Exception as e:
    self.logger.info(e)
    raise
return False

И у меня есть такие исключения во время выполнения.

selenium.common.exceptions.NoSuchElementException: 
Message: no such element: Unable to locate element: 
 {"method":"xpath","selector":"//*[@id='ctl00_HeaderAfterLogin1_DL_Portals1']/tbody/tr/td[4]/a/img"}

Кто-нибудь знает лучший способ справиться с этим, кроме xpath, который я использовал?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Когда откроется раскрывающееся окно, чтобы щелкнуть значок с текстом Выйти , вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующих Стратегии локатора :

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.portals-separator +table td>a[title='Log out'][data-mkey='Logout']>img"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Support and Settings']//following-sibling::table[1]//td/a[@title='Log out' and @data-mkey='Logout']/img"))).click()
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
1 голос
/ 05 марта 2020

Скорее всего, проблема заключается в том, что раскрывающееся меню не было полностью развернуто / отображено после щелчка. В то время как команда time.sleep(1) может быть потенциальным исправлением, более подходящее исправление - это динамическое c ожидание с использованием WebDriverWait:

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait

by = By.XPATH  # This could also be By.CSS_SELECTOR, By.Name, etc.
hook = "//*[@id='ctl00_HeaderAfterLogin1_DL_Portals1']/tbody/tr/td[4]/a/img"
max_time_to_wait = 10  # Maximum time to wait for the element to be present
WebDriverWait(driver, max_time_to_wait).until(expected_conditions.element_to_be_clickable((by, hook)))

expected_conditions также может ожидать с использованием visibility_of_element_located или presence_of_element_located

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...