Jestem całkiem nowy w Pythonie selen i próbuję kliknąć przycisk, który ma następującą strukturę 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>
Chciałbym móc klikać oba powyższe przyciski Search
i Reset
(oczywiście indywidualnie).
Próbowałem kilku rzeczy, na przykład:
driver.find_element_by_css_selector('.button .c_button .s_button').click()
lub,
driver.find_element_by_name('s_image').click()
lub,
driver.find_element_by_class_name('s_image').click()
ale wydaje mi się, że zawsze kończy się NoSuchElementException
na przykład:
selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;
Zastanawiam się, czy mogę w jakiś sposób użyć atrybutów onclick HTML, aby uzyskać kliknięcie selenu?
Wszelkie myśli, które mogą skierować mnie we właściwym kierunku, byłyby świetne. Dzięki.
element
?Usuń spację między klasami w selektorze 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()
źródło
NoSuchElementException
błąd!print(driver.page_source)
i sprawdź, czy html faktycznie zawiera element.print(driver.page_source)
i stwierdziłem, że został nazwany inaczej. Dziwne. Klika teraz, kiedy usunąłem spacje i zmieniłem nazwę. W dalszej kolejności: jak widać, nawet przycisk resetowania i przycisk wyszukiwania mają to samoclass
: jak rozróżnić przyciski wyszukiwania i resetowania podczas klikania w tym przypadku?driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
Spróbuj tego:
pobierz firefox, dodaj wtyczki "firebug" i "firepath"; po ich zainstalowaniu wejdź na swoją stronę, uruchom firebuga i znajdź xpath elementu, jest on unikalny na stronie, więc nie możesz popełnić błędu.
Widzieć zdjęcie:
browser.find_element_by_xpath('just copy and paste the Xpath').click()
źródło
Miałem ten sam problem używając Phantomjsa jako przeglądarki, więc rozwiązałem go w następujący sposób:
driver.find_element_by_css_selector('div.button.c_button.s_button').click()
Zasadniczo dodałem nazwę znacznika DIV do cytatu.
źródło
otwórz stronę internetową https://adviserinfo.sec.gov/compilation i kliknij przycisk, aby pobrać plik, a nawet chcę zamknąć wyskakujące okienko, jeśli używa selenu w języku Python
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()
źródło
Poniższy proces debugowania pomógł mi rozwiązać podobny problem.
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'))
Powinieneś wtedy mieć dwa pliki tekstowe z początkową stroną, na której byłeś („output_init.txt”) i stroną, na którą zostałeś przekierowany po kliknięciu przycisku („output_dest.txt”). Jeśli są takie same, to tak, twój kod nie działa. Jeśli tak nie jest, kod zadziałał, ale masz inny problem. Wydawało mi się, że problem polegał na tym, że niezbędny skrypt javascript, który przekształcił zawartość w celu utworzenia mojego zaczepu, nie został jeszcze wykonany.
Twoje opcje, jak ja to widzę:
Podejście xpath niekoniecznie jest lepsze, po prostu je wolę, możesz także użyć metody selektora.
źródło