programing

python selenium 클릭 버튼

bestprogram 2023. 7. 26. 22:14

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

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

저에게 올바른 방향을 제시할 수 있는 어떤 생각이라도 좋습니다.감사해요.

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()

사용해 보십시오.

파이어폭스를 다운로드하고 플러그인 "firebug"와 "firepath"를 추가합니다. 설치한 후 웹 페이지로 이동하여 파이어버그를 시작하고 요소의 xpath를 찾으면 페이지에서 고유하므로 실수가 발생하지 않습니다.

사진 보기:

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

python의 경우 다음을 사용합니다.

from selenium.webdriver import ActionChains

그리고.

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

웹사이트 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()

Phantomjs를 브라우저로 사용하는 것과 같은 문제가 있어서 다음과 같은 방법으로 해결했습니다.

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

기본적으로 견적서에 DIV 태그의 이름을 추가했습니다.

다음 디버깅 프로세스는 유사한 문제를 해결하는 데 도움이 되었습니다.

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. 드라이버에게 Javascript를 실행한 다음 find 요소 코드를 호출하도록 합니다.스택 오버플로에 대한 자세한 답변은 이 접근 방식을 따르지 않았기 때문에 확인하십시오.
  2. 'output_dest'에서 비슷한 후크를 찾기만 하면 됩니다.txt'도 같은 결과를 낼 것이고, 그것이 제가 한 일입니다.
  3. 다음을 클릭하기 전에 잠시 기다려 보십시오.

xpath2 = "클릭할 xpath"

WebDriverWait(드라이버, 시간 초과=5).until(확장 x: x.find_details_by_xpath(xpath2))

xpath 접근 방식이 반드시 더 나은 것은 아닙니다. 저는 그냥 선호합니다. 선택기 접근 방식을 사용할 수도 있습니다.

저도 같은 문제가 있었고 Firefox에서 다음과 같은 단계로 버튼 요소를 받았습니다.

  • 마우스 오른쪽 단추를 누른 후 "접근성 속성 검사"를 선택합니다.
  • 그러면 검사자가 열립니다.강조 표시된 줄을 마우스 오른쪽 단추로 클릭하고 "JSON으로 인쇄"를 클릭합니다.
  • 새 탭이 열립니다.찾다를 .nodeCssSelector 값 복사를 .

이를 통해 야후라는 웹사이트의 쿠키를 사용할 수 있게 되었습니다.

url = "https://yahoo.com"
driver = Firefox(executable_path="geckodriver.exe")
driver.get(url)
driver.find_element_by_css_selector("button.btn:nth-child(5)").click()

저는 이것을 더 테스트했고 그것은 제가 개별 쿠키를 쉽게 받아들일 수 있게 해주었습니다.앞에서 언급한 단계를 반복하면 버튼 이름이 표시됩니다.

url = "https://yahoo.com"
driver = Firefox(executable_path="geckodriver.exe")
driver.get(url)
driver.find_element_by_css_selector("a.btn").click()
driver.find_element_by_css_selector(".firstPartyAds > div:nth-child(2) > label:nth-child(1)").click()
driver.find_element_by_css_selector(".preciseGeolocation > div:nth-child(2) > label:nth-child(1)").click()
driver.find_element_by_css_selector("button.btn").click()

또 다른 방법은

  • 관심 버튼을 마우스 오른쪽 버튼으로 클릭하고 "Inspect"를 선택합니다.
  • 강조 표시된 줄을 마우스 오른쪽 버튼으로 클릭하고 "복사 -> CSS 선택기" 또는 필요한 모든 항목을 클릭합니다(XPath를 포함한 여러 옵션이 있음).

그러나 두 번째 방법은 복사하는 내용에 따라 공백이 포함될 수 있으므로 수동으로 제거해야 할 수도 있습니다.첫 번째 방법이 더 완벽한 것처럼 보이지만 파이어폭스가 아닌 다른 브라우저에서 작동하는지/어떻게 작동하는지는 모르겠습니다.두 번째 방법은 모든 브라우저에서 작동해야 합니다.

e = driver.find_element(By.XPATH, 's_image').click()

가끔은 작동하지 않습니다! 당신은 시도할 수 있습니다:

e = driver.find_element(By.XPATH, 's_image') driver.execute_script("arguments[0].click();", e)

이 코드를 사용하여 버튼 클릭

# finding the button using ID
button = driver.find_element_by_id(ID)

# clicking on the button
button.click()

언급URL : https://stackoverflow.com/questions/21350605/python-selenium-click-on-button