अजगर सेलेनियम बटन पर क्लिक करें


88

मैं अजगर सेलेनियम के लिए काफी नया हूं और मैं एक बटन पर क्लिक करने की कोशिश कर रहा हूं जिसमें निम्नलिखित 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 के ऑनक्लिक विशेषताओं का उपयोग कर सकता हूं?

कोई भी विचार जो मुझे सही दिशा में इंगित कर सकता है वह बहुत अच्छा होगा। धन्यवाद।

जवाबों:



106

सीएसएस चयनकर्ता में कक्षाओं के बीच स्थान निकालें:

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त्रुटि मिलती है !
एजेडब्ल्यू

2
@AJW, कोशिश करो print(driver.page_source), और HTML की जाँच करें वास्तव में तत्व शामिल हैं।
फालसेतु

धन्यवाद। मैंने किया print(driver.page_source)और पाया कि इसे अलग नाम दिया गया था। अजीब। यह अब क्लिक करता है जब मैंने रिक्त स्थान ले लिया और नाम बदल दिया। एक अनुवर्ती थियो पर: जैसा कि आप रीसेट बटन भी देख सकते हैं और खोज बटन में समान है class: इस मामले में क्लिक करते समय खोज और रीसेट बटन के बीच कोई अंतर कैसे करता है?
एजेडब्ल्यू

1
@AJW, हाउ एबाउट xpath का उपयोग कर:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru

1
@MortezaLSC, यदि आपका मतलब है कि यह सिस्टम में संभव है जहां कोई GUI नहीं है, तो यह संभव है। हेडलेस ब्राउजर का इस्तेमाल करें। उदाहरण के लिए, PhantomJS।
falsetru

31

इसे इस्तेमाल करे:

फ़ायरफ़ॉक्स डाउनलोड करें, प्लगइन "फायरबग" और "फायरपाथ" जोड़ें; स्थापित करने के बाद उन्हें अपने वेबपेज पर जाएं, फ़ायरबग शुरू करें और तत्व का xpath ढूंढें, यह पृष्ठ में अद्वितीय है ताकि आप कोई गलती न कर सकें।

तस्वीर देखो: अनुदेश

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


5
इतनी जबरदस्त लाइफहाक के लिए बहुत-बहुत धन्यवाद। इसने कई घंटे बचाए
हीरो गाइ

इस पर काम नहीं करता है MAC bc दोनों फ़ायरबग और आग पथ को जोड़ने के रूप में नहीं दिखा रहे हैं
Bob

कुछ समय यह ओएस की समस्या नहीं है, लेकिन फ़ायरफ़ॉक्स संस्करण, पिछले फ़ायरफ़ॉक्स संस्करण में फ़ायरपैथ के साथ कुछ समस्या है, मैं फ़ायरफ़ॉक्स 55.0.3 का उपयोग कर रहा हूं
कार्लो 1585

1
आप का उपयोग कर फ़ायरफ़ॉक्स पर तत्व पा सकते हैं: उपकरण-> वेब डेवलपर-> इंस्पेक्टर; इंस्पेक्टर भाग पर GUI पर बटन पर क्लिक करें, संबंधित कोड पर माउस से राइट क्लिक करें- कॉपी और चुनें: CSS चयनकर्ता / CSS Path / Xpath ...
Nir

4

मुझे ब्राउज़र के रूप में फैंटमज का उपयोग करने में एक ही समस्या थी, इसलिए मैंने निम्नलिखित तरीके से हल किया:

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

अनिवार्य रूप से मैंने DIV टैग का नाम उद्धरण में जोड़ा है।


3

एक वेबसाइट 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()

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. चालक ने जावास्क्रिप्ट को निष्पादित किया है और फिर अपने खोज तत्व कोड को कॉल करें। स्टैकओवरफ़्लो पर इस पर अधिक विस्तृत उत्तरों की तलाश करें, क्योंकि मैंने इस दृष्टिकोण का पालन नहीं किया था।
  2. बस 'output_dest.txt' पर एक तुलनीय हुक खोजें जो कि वही परिणाम देगा, जो मैंने किया था।
  3. कुछ भी क्लिक करने से पहले थोड़ा इंतजार करने की कोशिश करें:

xpath2 = "आपका xpath जिस पर आप क्लिक करने जा रहे हैं"

WebDriverWait (ड्राइवर, टाइमआउट = 5) .until (लैम्ब्डा x: x.find_element_by_xpath (xpath2))

Xpath दृष्टिकोण जरूरी बेहतर नहीं है, मैं सिर्फ इसे पसंद करता हूं, आप अपने चयनकर्ता दृष्टिकोण का भी उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.