파이썬 셀레늄 클릭 버튼


84

나는 파이썬 셀레늄을 처음 접했고 다음과 같은 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>

위 의 SearchReset버튼을 모두 클릭 할 수 있기를 바랍니다 (분명히 개별적으로).

예를 들어 몇 가지 시도했습니다.

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"}' ;

어떻게 든 HTML의 onclick 속성을 사용하여 셀레늄 클릭을 할 수 있는지 궁금합니다.

나를 올바른 방향으로 인도 할 수있는 어떤 생각이라도 좋을 것입니다. 감사.

답변:


15

파이썬의 경우

from selenium.webdriver import ActionChains

ActionChains(browser).click(element).perform()

102

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 2014 년

2
@AJW, Try print(driver.page_source)및 html에 실제로 요소가 포함되어 있는지 확인하십시오.
falsetru

감사. 나는 print(driver.page_source)그 이름이 다른 것을 발견했습니다. 이상한. 이제 공백을 제거하고 이름을 바꾸면 클릭됩니다. 후속 조치에서 : 재설정 버튼과 검색 버튼도 동일합니다 class.이 경우 클릭하는 동안 검색 버튼과 재설정 버튼을 어떻게 구분합니까?
AJW 2014 년

1
@AJW, xpath를 사용하는 방법 :driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru

1
@MortezaLSC, GUI가없는 시스템에서 가능하다는 뜻이라면 가능합니다. 헤드리스 브라우저를 사용하십시오. 예 : PhantomJS.
falsetru

30

이 시도:

firefox를 다운로드하고 "firebug"및 "firepath"플러그인을 추가합니다. 설치 후 웹 페이지로 이동하여 방화범을 시작하고 요소의 xpath를 찾으십시오. 페이지에서 고유하므로 실수하지 마십시오.

그림 참조 : 교수

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


5
멋진 lifehack에 감사드립니다. 그것은 많은 시간을 저장
영웅 사람에게

하지 불을 지르고 화재 경로를 모두 추가 기능으로 표시되지 않습니다 BC 맥에서이없는 작업

언젠가는 OS 문제가 아니지만 Firefox 버전, 마지막 Firefox 버전은 FirePath에 문제가 있습니다. 저는 Firefox 55.0.3을 사용하고 있습니다.
Carlo 1585

1
Firefox에서 도구-> 웹 개발자-> 검사기를 사용하여 요소를 찾을 수 있습니다. GUI의 버튼을 클릭하고 검사기 부분에서 해당 코드를 마우스 오른쪽 버튼으로 클릭하고 복사 한 다음 선택 : CSS 선택기 / CSS 경로 / 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')가 포함 된 두 개의 텍스트 파일이 있어야합니다. 같으면 코드가 작동하지 않습니다. 그렇지 않은 경우 코드는 작동했지만 다른 문제가있는 것입니다. 나에게 문제는 내 후크를 생성하기 위해 콘텐츠를 변환하는 데 필요한 자바 스크립트가 아직 실행되지 않은 것 같습니다.

내가 보는 옵션 :

  1. 드라이버가 자바 스크립트를 실행하도록 한 다음 찾기 요소 코드를 호출합니다. 이 접근 방식을 따르지 않았으므로 stackoverflow에서 이에 대한 자세한 답변을 찾으십시오.
  2. 'output_dest.txt'에서 동일한 결과를 생성하는 유사한 후크를 찾으십시오.
  3. 아무 것도 클릭하기 전에 잠시 기다리십시오.

xpath2 = "클릭 할 xpath"

WebDriverWait (driver, timeout = 5) .until (lambda x : x.find_element_by_xpath (xpath2))

xpath 접근 방식이 반드시 더 나은 것은 아닙니다. 제가 선호하는 방식이며 선택기 접근 방식을 사용할 수도 있습니다.


1

웹 사이트 https://adviserinfo.sec.gov/compilation 을 열고 버튼을 클릭하여 파일을 다운로드하고 심지어 파이썬 셀레늄을 사용하는 경우 팝업을 닫고 싶습니다.

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.