python селен натисніть на кнопку


84

Я зовсім новачок у python селені, і намагаюся натиснути кнопку, яка має таку структуру 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, щоб зробити селен клацанням?

Будь-які думки, які можуть направити мене у правильному напрямку, були б чудовими. Дякую.

Відповіді:



103

Видалити пробіл між класами в селекторі 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.
falsetru

30

спробуйте це:

завантажте firefox, додайте плагін "firebug" і "firepath"; після їх встановлення перейдіть на вашу веб-сторінку, запустіть firebug і знайдіть xpath елемента, він унікальний на сторінці, тому ви не можете помилитися.

Дивіться малюнок: інструкція

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


5
Щиро дякую за такий чудовий лайфхак. Це врятувало багато годин
Герой Гай

це не працює на mac bc, як firebug, так і шлях пожежі не відображаються як доповнення
Bob

Деякий час це не проблема ОС, але версія Firefox, остання версія Firefox має певні проблеми з FirePath, я використовую Firefox 55.0.3
Carlo 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 у цитату.


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, а потім викликає код пошуку елемента find. Шукайте більш детальні відповіді щодо цього на stackoverflow, оскільки я не дотримувався цього підходу.
  2. Просто знайдіть порівнянний хук на 'output_dest.txt', який дасть той самий результат, що я і зробив.
  3. Спробуйте трохи почекати, перш ніж клацнути що-небудь:

xpath2 = "ваш xpath, на якому ви збираєтеся натиснути"

WebDriverWait (драйвер, час очікування = 5). До (лямбда x: x.find_element_by_xpath (xpath2))

Підхід xpath не обов'язково кращий, я просто віддаю йому перевагу, ви також можете використовувати свій підхід селектора.


1

відкрийте веб-сайт 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.