Selenium WebDriver не может щелкнуть элемент, даже если он кажется видимым - PullRequest
0 голосов
/ 29 июня 2018

Используя Python 2, Selenium используя Firefox , на этой странице я пытаюсь, чтобы драйвер нажал следующую кнопку (увеличительное стекло):

enter image description here

<button id="search-btn" type="button" class="header__user-menu-item header__search-btn">
          <span class="sr-only">Search</span>
          <img src="/sites/default/themes/custom/smp_bootstrap/images/search.svg" class="header__user-menu-icon fa fa-search fa-fw" alt="Search">
        </button>

Я использую следующий код для XPath элемента, x = '//*[@id="search-btn"]':

x = '//*[@id="search-btn"]'

try:
    element = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, x)))
except:
    print "Element not clickable"
else:
    found_element = driver.find_element_by_xpath(x)
    try:
        found_element.click()
    except:
        raise

Общее исключение Selenium EC.element_to_be_clickable не идентифицирует элемент, а также visibility_of_element_located и presence_of_element_located.

Странно, однако, что в некоторых случаях драйвер фактически мог идентифицировать элемент и затем выполнить driver.find_element_by_xpath(x), который, кажется, находит XPath и .click() элемент. В этот момент все работает. На секунду я подумал, что сценарий должен был быстро выполнить операцию до загрузки страницы, но для загрузки страницы достаточно 5 секунд WebDriverWait, и перед этим у меня есть дополнительный режим загрузки страницы.

Элемент, кажется, не находится в IFrame. Я уже прошел через кнопки «Принять условия» и т. Д.

Я использую последние версии Firefox (61.0), Selenium (3.13) и Geckodriver (0.21.0).

В чем здесь может быть проблема?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Вместо нацеливания на элемент <button> для более детального подхода вы можете нацелить тег <img> следующим образом:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//img[@class='header__user-menu-icon fa fa-search fa-fw' and @alt='Search']"))).click()
0 голосов
/ 29 июня 2018

Используя Firefox в качестве драйвера, я смог щелкнуть элемент, выполнив JavaScript:

driver.execute_script("window.document.getElementById('search-btn').click()")

Обратите внимание, что вышеупомянутое является нетрадиционной мерой, которая не должна быть необходимой. Остальные ответы верны, и обычный способ сделать это.

Проблема заключается в том, что драйвер Selenium не может идентифицировать элементы XPath из-за ошибки в текущей версии geckodriver (0.21.0) в сочетании с Selenium (3.13.0), см .: Сломанная ошибка канала Селен webdriver, когда есть разрыв между командами?

Я понижен до geckodriver 0.20.1, чтобы избежать проблемы.

0 голосов
/ 29 июня 2018

если я получу элемент с By.ID, а не с By.XPATH, это работает, может быть, вы ошиблись xpath?

если использовать xpath это также работает x = '//*[@id="search-btn"]'

id = 'search-btn'
element = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, id)))
element.click() 
...