Я новичок в 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, чтобы щелкнуть селеном?
Любые мысли, которые могут указать мне правильное направление, были бы замечательными. Благодарю.
element
?Убрать пробел между классами в селекторе 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()
источник
NoSuchElementException
ошибка!print(driver.page_source)
, и проверь, что html действительно содержит элемент.print(driver.page_source)
и обнаружил, что он назван по-другому. Странный. Теперь щелкает, когда я убрал пробелы и переименовал. Далее: как вы можете видеть, даже кнопка сброса и кнопка поиска имеют то же самоеclass
: как в этом случае различать кнопки поиска и сброса при нажатии?driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
попробуй это:
скачать firefox, добавить плагин «firebug» и «firepath»; после их установки перейдите на свою веб-страницу, запустите firebug и найдите xpath элемента, он уникален на странице, поэтому вы не можете ошибиться.
Смотрите картинку:
browser.find_element_by_xpath('just copy and paste the Xpath').click()
источник
У меня была такая же проблема с использованием Phantomjs в качестве браузера, поэтому я решил следующим образом:
driver.find_element_by_css_selector('div.button.c_button.s_button').click()
По сути, я добавил в цитату имя тега DIV.
источник
откройте веб-сайт 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()
источник
Следующий процесс отладки помог мне решить аналогичную проблему.
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, который преобразовывал контент для создания моей ловушки, еще не был выполнен.
Ваши варианты, как я это вижу:
Подход xpath не обязательно лучше, я просто предпочитаю его, вы также можете использовать свой селекторный подход.
источник