python selenium нажмите кнопку


88

Я новичок в python selenium, и я пытаюсь нажать кнопку со следующей структурой html:

<div class="b_div">

    <div class="button c_button s_button" onclick="submitForm('mTF')">
        <input class="very_small" type="button"></input>
        <div class="s_image"></div>
        <span>
           Search
        </span>
    </div>

    <div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
        <input class="v_small" type="button"></input>
        <span>
              Reset
        </span>
   </div>

</div>

Я хотел бы иметь возможность нажать как Searchи Resetкнопки выше (очевидно , индивидуально).

Я пробовал, например, пару вещей:

driver.find_element_by_css_selector('.button .c_button .s_button').click()

или же,

driver.find_element_by_name('s_image').click()

или же,

driver.find_element_by_class_name('s_image').click()

но, кажется, я всегда получаю NoSuchElementException, например:

selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;

Мне интересно, могу ли я каким-то образом использовать атрибуты onclick HTML, чтобы щелкнуть селеном?

Любые мысли, которые могут указать мне правильное направление, были бы замечательными. Благодарю.

Ответы:



106

Убрать пробел между классами в селекторе css:

driver.find_element_by_css_selector('.button .c_button .s_button').click()
#                                           ^         ^

=>

driver.find_element_by_css_selector('.button.c_button.s_button').click()

1
Я попробовал то, что вы предложили. У меня такая же NoSuchElementExceptionошибка!
AJW

2
@AJW, попробуй print(driver.page_source), и проверь, что html действительно содержит элемент.
falsetru

Благодарю. Я сделал print(driver.page_source)и обнаружил, что он назван по-другому. Странный. Теперь щелкает, когда я убрал пробелы и переименовал. Далее: как вы можете видеть, даже кнопка сброса и кнопка поиска имеют то же самое class: как в этом случае различать кнопки поиска и сброса при нажатии?
AJW

1
@AJW, как аобут использовать xpath:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru

1
@MortezaLSC, если вы имеете в виду, что это возможно в системе, где нет графического интерфейса, это возможно. Используйте безголовые браузеры. Например, PhantomJS.
фальсетру

31

попробуй это:

скачать firefox, добавить плагин «firebug» и «firepath»; после их установки перейдите на свою веб-страницу, запустите firebug и найдите xpath элемента, он уникален на странице, поэтому вы не можете ошибиться.

Смотрите картинку: инструкция

browser.find_element_by_xpath('just copy and paste the Xpath').click()


5
Большое спасибо за такой классный лайфхак. Это сэкономило много часов
Hero Guy

это не работает на Mac bc, как firebug, так и fire path не отображаются как надстройки
Боб

Некоторое время это проблема не ОС, а версии Firefox, последняя версия Firefox имеет проблемы с FirePath, я использую Firefox 55.0.3
Карло 1585

1
Вы можете найти элемент в Firefox, используя: Инструменты-> Веб-разработчик-> Инспектор; нажмите кнопку в графическом интерфейсе пользователя в части инспектора, щелкните правой кнопкой мыши соответствующий код-> скопируйте и выберите: CSS Selector / CSS Path / Xpath ...
Nir

4

У меня была такая же проблема с использованием Phantomjs в качестве браузера, поэтому я решил следующим образом:

driver.find_element_by_css_selector('div.button.c_button.s_button').click()

По сути, я добавил в цитату имя тега DIV.


3

откройте веб-сайт https://adviserinfo.sec.gov/compilation и нажмите кнопку, чтобы загрузить файл, и даже я хочу закрыть всплывающее окно, если оно используется с использованием python selenium

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options 

#For Mac - If you use windows change the chromedriver location
chrome_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_path)

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-popup-blocking")

driver.maximize_window()
driver.get("https://adviserinfo.sec.gov/compilation")

# driver.get("https://adviserinfo.sec.gov/")
# tabName = driver.find_element_by_link_text("Investment Adviser Data")
# tabName.click()

time.sleep(3)

# report1 = driver.find_element_by_xpath("//div[@class='compilation-container ng-scope layout-column flex']//div[1]//div[1]//div[1]//div[2]//button[1]")

report1 = driver.find_element_by_xpath("//button[@analytics-label='IAPD - SEC Investment Adviser Report (GZIP)']")

# print(report1)
report1.click()

time.sleep(5)

driver.close()

2

Следующий процесс отладки помог мне решить аналогичную проблему.

with open("output_init.txt", "w") as text_file:
    text_file.write(driver.page_source.encode('ascii','ignore'))


xpath1 = "the xpath of the link you want to click on"
destination_page_link = driver.find_element_by_xpath(xpath1)
destination_page_link.click()


with open("output_dest.txt", "w") as text_file:
    text_file.write(driver.page_source.encode('ascii','ignore'))

У вас должно быть два текстовых файла с начальной страницей, на которой вы были ('output_init.txt'), и страницей, на которую вы были перенаправлены после нажатия кнопки ('output_dest.txt'). Если они такие же, то да, ваш код не работает. Если это не так, значит, ваш код работал, но у вас есть другая проблема. Для меня проблема заключалась в том, что необходимый javascript, который преобразовывал контент для создания моей ловушки, еще не был выполнен.

Ваши варианты, как я это вижу:

  1. Попросите драйвер выполнить javascript, а затем вызвать код вашего элемента поиска. Более подробные ответы на этот вопрос можно найти в stackoverflow, поскольку я не следовал этому подходу.
  2. Просто найдите сопоставимый хук в output_dest.txt, который даст тот же результат, что я и сделал.
  3. Попробуйте немного подождать, прежде чем что-либо щелкнуть:

xpath2 = "ваш xpath, по которому вы собираетесь щелкнуть"

WebDriverWait (драйвер, таймаут = 5) .until (лямбда x: x.find_element_by_xpath (xpath2))

Подход xpath не обязательно лучше, я просто предпочитаю его, вы также можете использовать свой селекторный подход.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.