2017-03-07 6 views
0

Ich versuche einen Knopf zu finden, normalerweise meinen normalen Stil, der immer bis jetzt funktioniert. Ich vermute, es ist der Abstand. Ich habe versucht, mit "Assignees" zu lokalisieren. Ich benutze Selen-Webdriver, aber die Frage ist ziemlich viel auf XPath. Mein Wrapper ist als solche:xpath locate taste text

class WebdriverChauffuerMixin(object): 

    def locate_element(self, search_text=None, xpath=None): 
     if not xpath: 
      xpaths = [ "//input[@value='{text}']", "//button[normalize-space(text())='{text}']", 
        "//a[child::span[normalize-space(text())='{text}']]", "//a[normalize-space(text())='{text}']"] 
     else: 
      return self.find_element_by_xpath(xpath) 
     try: 
      return self.find_element_by_id(search_text) 
     except: 
      try: 
       return self.find_element_by_name(search_text) 
      except: 
       try: 
        return self.find_element_by_class_name(search_text) 
       except: 
        for path in xpaths: 
         try: 
          return self.find_element_by_xpath(path.format(text=search_text)) 
         except: 
          pass 
     return None 

... 

class FirefoxDriver(WebdriverChauffuerMixin, webdriver.Firefox): 
    pass 

Die html ist wie:

 <div class="discussion-sidebar-item sidebar-assignee js-discussion-sidebar-item"> 
    <div class="js-issue-sidebar-form" data-url="/myproject/project/issues/new/show_partial?partial=issues%2Fsidebar%2Fnew%2Fassignees"> 

    <div class="select-menu js-menu-container js-select-menu " 

     data-multiple data-max-options=10> 

    <button type="button" 
      class="discussion-sidebar-heading discussion-sidebar-toggle js-menu-target" 
      aria-label="Assign up to 10 people to this issue" aria-haspopup="true" 
      data-hotkey="a"> 
     <svg aria-hidden="true" class="octicon octicon-gear" height="16" version="1.1" viewBox="0 0 14 16" width="14"><path d="M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"></path></svg> 
     Assignees 
    </button> 

    <div class="select-menu-modal-holder js-menu-content js-navigation-container" aria-hidden="true"> 
     <div class="select-menu-modal"> 
     <div class="select-menu-header"> 
      <svg aria-label="Close" class="octicon octicon-x js-menu-close" height="16" role="img" version="1.1" viewBox="0 0 12 16" width="12"><path d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"></path></svg> 
      <span class="select-menu-title">Assign up to 10 people to this issue</span> 
     </div> 


<div class="select-menu-filters"> 
    <div class="select-menu-text-filter"> 
    <input type="text" id="assignee-filter-field" class="js-filterable-field js-navigation-enable" 
      placeholder="Filter people" aria-label="Type or choose a name" autocomplete="off"> 
    </div> 
</div> 

<div class="js-max-warning warning d-none"> 
    You can only select 10 assignees. 
</div> 

XPath von "//button[normalize-space(text())='{text}']" immer vor an dieser Stelle gearbeitet. Wie nehme ich das button Element, das Assignees sagt? Ty

Antwort

1

Wenn es ein Abstand/Padding Problem ist, haben Sie versucht, die contains-Funktion von XPATH zu verwenden? Zum Beispiel: "//input[contains(@value,'{text}')]" usw.

+0

ja diese zu lokalisieren hat funktioniert. Ich hatte Glück auf einer anderen Suche. Beide Antworten sind großartig, das funktioniert für jeden Text, wenn Sie spezifisch genug sind, gewinnen Sie – codyc4321

1

Sie könnten Schaltfläche finden mit unten XPath Ausdruck:

"//button[normalize-space(.)='{text}']" 

Sie können this überprüfen, um weitere Informationen darüber, wie Textinhalt verwenden Elemente in XPath

+0

beide Antworten sind toll, ty – codyc4321