Selenium webdriver — Python не будет нажимать кнопку на веб-сайте

#python-2.7 #selenium #selenium-webdriver

#python-2.7 #selenium #selenium-webdriver

Вопрос:

Это мой первый вопрос о переполнении стека. Я не очень хороший программист, я только что узнал о Selenium и зашел так далеко, как мог, но есть ошибка, которую я не могу исправить в одиночку, поэтому я прошу о помощи. Я использую Python 2.7 в PyCharm.

На данный момент я использую anything.send_keys (ключи.ВВЕДИТЕ), чтобы нажать некоторые кнопки в моем коде, поскольку функция .click() всегда возвращала мне ошибку ElementNotInteractableException в Chrome для этого веб-сайта. Цель здесь — просто очистить текстовую область, вставить туда список генов и нажать на эту кнопку «Отправить». Предполагается, что это покажет мне обновленную таблицу, которую я хочу загрузить.

Однако для этой одной проблемной кнопки ничего не работает. Дело в том, что он даже не возвращает ошибку, код продолжает выполняться, как если бы он действительно щелкнул, и в конечном итоге загружает не обновленную таблицу. Я попытался переключиться на Firefox, где ни .click (), ни .send_keys (ключи.ВВОД) сработал (я также никогда не получаю ошибку, он просто загружает неправильную таблицу). Нажатие на себя работает и создает обновленную таблицу.

Основываясь на других вопросах, которые я видел здесь, я попытался использовать ActionChains или scroll_into_view, но по-прежнему ничего не происходит. Вот код :

 baseline_url = "http://mtsspdb.noble.org/atlas-internal/3880/transcript/profile/5?charttype=barchartamp;sessionid=1553076490500118amp;feature_accs= Medtr1g079760.1"
driver = webdriver.Chrome("C:Webdriverschromedriver.exe")
driver.set_page_load_timeout(30)
driver.get(baseline_url)
driver.maximize_window()

peptides_list = """Medtr4g068220.1
Medtr1g107390.1
Medtr1g018740.1
Medtr5g016470.1
Medtr4g095002.1
Medtr5g004930.1
MT4Noble_020581.1
Medtr1g107395.1
Medtr1g107400.1
Medtr1g107405.1
Medtr1g107410.1
Medtr4g095010.1
MT4Noble_057127.1
"""
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//*[@id='feature_accs']")))
text_area = driver.find_element_by_xpath("//*[@id='feature_accs']")
text_area.clear()
text_area.send_keys(peptides_list)
time.sleep(1)
troublesome = driver.find_element_by_xpath("//*[@id='form1']/div[8]/div/input")
print troublesome
#scroll_into_view = troublesome.location_once_scrolled_into_view
ActionChains(driver).move_to_element(troublesome).send_keys(Keys.ENTER)

time.sleep(3)
print "Sucess for x"
  

Расположение этой кнопки в html

     <input class="btn btn-primary" type="submit" name="submit" value="Submit">
  

Есть ли у вас какие-либо идеи о том, как на нее нажать, и, прежде всего, о том, почему это не работает?

Большое спасибо

PS: Как я уже говорил ранее, это мой первый вопрос. Пожалуйста, скажите мне, нужно ли мне что-то обновить / изменить.

Комментарии:

1. У вас отсутствует div индекс, пожалуйста, введите и попробуйте еще раз, и вы также можете использовать xpath, чтобы найти его, используя classname, что также будет одним из решений

Ответ №1:

Это определенно сработает, поскольку я только что попробовал это, учитывая вашу информацию

 driver.execute_script("$('#form1').find('.btn-primary').click()")
  

Теперь, должно быть, что-то странное в том, что он находит элемент, поскольку Selenium выдаст ошибку, если не сможет щелкнуть. Таким образом, элемент, на который мы нажимаем с помощью кода, не должен иметь событий, которые мы ожидаем от него. Я продолжаю расследование и дополню его подробностями.

Редактировать: Интересно. Кнопка отправки, похоже, не имеет обычных прослушивателей событий.

 getEventListeners($(".btn-primary")[0]);
$._data($(".btn-primary")[0], "events");
  

Оба они ничего не возвращают. Это, по-видимому, является причиной проблемы с Selenium. Это не запускает фактическую отправку щелчком мыши. Selenium не использует Javascript, а также не использует реальный user32.dll (например, Windows) щелчок, поэтому он не всегда ведет себя идентично реальному щелчку или щелчку javascript.

Комментарии:

1. Большое вам спасибо за ваш ответ, он отлично работает! Я собираюсь взглянуть на то, что такое javascript, потому что я понятия не имею. Тем не менее, это работает, и этого будет достаточно, большое спасибо. Если вы найдете ответ на вопрос, почему это странно, мне очень интересно узнать, почему, потому что это сводило меня с ума

Ответ №2:

Добро пожаловать в SO. Здесь есть возможность нажать на кнопку.

Вариант 1: щелкните с помощью javascript

 driver.exeucte_script("arguments[0].click();",troublesome)
  

Вариант 2: прокрутка до элемента

 troublesome.location_once_scrolled_into_view
troublesome.click()
  

Комментарии:

1. Спасибо за ваш быстрый ответ! Javascript действительно работал, однако я не знаю, как это работает на самом деле, я никогда этим не пользовался. Спасибо, что решили это для меня, и я посмотрю, что это на самом деле. Я уже пробовал прокручивать до элемента (прокомментировал свой код выше), и это не сработало, однако

2. @RLS_Jekyde Если вы считаете, что проблема решена, пожалуйста, примите ответ, нажав на галочку под кнопкой голосования «Против» с левой стороны.

Ответ №3:

Это хорошо работает для меня:

 for i in range(1, 10):
    try:
        driver.find_element_by_xpath(
        f'/html/body/div[{i}]/div/div[2]/span[1]/span/span/input').click()
    except:
        pass