2017-07-27 8 views
0

Ich verwende Selen in Python und kann es nicht finden und die OK-Schaltfläche auswählen. Hier ist der Code, den ich versuche, den Knopf nicht zu finden.Python Selen mit onclick

SubmitElem = driver.find_element_by_name('ctl00$PlaceHolderMain$ctl01$RptControls$btnOK') 

SubmitElem.submit() 

Und das ist die Webseiten-Code

<input name="ctl00$PlaceHolderMain$ctl01$RptControls$btnOK" 
value="OK" 
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$PlaceHolderMain$ctl01$RptControls$btnOK&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))"  
id="ctl00_PlaceHolderMain_ctl01_RptControls_btnOK" accesskey="o" 
class="ms-ButtonHeightWidth" type="submit"> 

Alle Ratschläge, was ich falsch mache? Ich habe einige Vorschläge zum Hinzufügen gefunden: onclick*=, aber es schien nicht zu funktionieren.

+0

Wenn das Element innerhalb eines Rahmens ist, müssen Sie zunächst den Kontext zu diesem Rahmen wechseln: Siehe [Selenium Element (Python) WebScraping nicht lokalisieren] (https://Stackoverflow.com/q/32636453/190597). – unutbu

Antwort

3

Wie bereits erwähnt, wenn das Element in einem Iframe ist, müssen Sie switch contexts. Wenn das Element Zeit benötigt, um im DOM angezeigt zu werden, benötigen Sie möglicherweise waits, da es dynamisch von JavaScript gerendert wird. Sie möchten im Grunde warten, bis das Element auf der Seite angezeigt wird, bevor Sie Aktionen ausführen.

Aus den Selen-Dokumentation:

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement")) 
) 
0

Hier ist die Antwort auf Ihre Frage:

Gemäß der HTML Sie zur Verfügung gestellt haben, können Sie die folgenden Optionen in Betracht ziehen:

  1. Sie können einen xpath basierend auf name wie folgt konstruieren:

    SubmitElem = driver.find_element_by_xpath("//input[@name='ctl00$PlaceHolderMain$ctl01$RptControls$btnOK']") 
    SubmitElem.submit() 
    
  2. können Sie auch versuchen, eine andere xpath basierend auf id wie folgt:

    SubmitElem = driver.find_element_by_xpath("//input[@id='ctl00_PlaceHolderMain_ctl01_RptControls_btnOK']") 
    SubmitElem.submit() 
    
  3. Alternativ können Sie auch prüfen, click() Methode anstelle von submit() Methode aufzurufen.

    SubmitElem.click() 
    
  4. Wieder scheint es mir, dass die id und name aufgrund der Anwesenheit von JavaScript und AJAX Anrufe dynamisch ist. In diesem Fall können Sie erwägen, einen dynamischen xpath zu konstruieren, wie folgt:

    SubmitElem = driver.find_element_by_xpath("//input[starts-with(@id, 'ctl00')]") 
    SubmitElem.submit() 
    
  5. Sie betrachten können ein dynamisches css_selector zu konstruieren, wie folgt:

    SubmitElem = driver.find_element_by_css_selector("input[id^='ctl00']") 
    SubmitElem.submit() 
    
  6. Schließlich, wenn Sie einen NoSuchElementException oder ElementNotVisibleException sehen Sie können erwägen, einige WebDriverWait wie folgt zu induzieren:

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[starts-with(@name, 'ctl00')]"))) 
    driver.find_element_by_css_selector("input[name^='ctl00']").click() 
    

Es gibt insgesamt vorgeschlagene Locators, um das Element zusammen mit anderen Optionen zu identifizieren.

Lassen Sie mich wissen, wenn dies Ihre Frage beantwortet.