Selenium находит ближайший элемент из уже заданного элемента без использования XPath - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь выбрать элемент на основе уже заданного элемента, используя Selenium и локаторы, но я пытаюсь ускорить процесс, и XPath действительно не помогает мне в этом случае.

Это структура HTML, с которым я работаю.

<div class="inner-article">
   <h1>
      <a class="name-link">
         Text 1
      </a>
   </h1>
   <p>
      <a class="name-link">
         Text 2
      </a>
   </p>
</div>

На данный момент я использую эти XPath для поиска текста 1 и текста 2

text1 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]")
text2 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]/parent::h1/following-sibling::p/a[contains(., 'Text 2')]")

Поскольку XPath имеет заметную задержку, мне было интересно, можно ли использовать другой и намного более быстрый локатор, кроме XPath. Я ничего не могу придумать, потому что CSS-селекторы не вариант, и я не могу придумать, как использовать другие.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Как узел <a> с текстом как Текст 1 всегда находится в пределах главного родительского узла <div class="inner-article"> и родительского узла <h1> и узла <a> с текстом как Текст 2 всегда находится в пределах родительского узла <div class="inner-article"> и родительского узла <p>, вы можете использовать любое из следующих решений:

  • xpath для Текст 1 :

    element_text1 = driver.find_element_by_xpath("//div[@class='inner-article']/h1/a[@class='name-link' and contains(., 'Text 1')]")
    
  • xpath для Текст 2 :

    element_text2 = driver.find_element_by_xpath("//div[@class='inner-article']//p/a[@class='name-link' and contains(., 'Text 2')]")- `xpath` for _Text 1_:
    
    element_text1 = driver.find_element_by_xpath("//div[@class='inner-article']/h1/a[@class='name-link' and contains(., 'Text 1')]")
    
  • xpath для Текст 2 :

    element_text2 = driver.find_element_by_xpath("//div[@class='inner-article']//p/a[@class='name-link' and contains(., 'Text 2')]")
    
  • xpath для Текст 1 и Текст 2 (относительно текста 1) :

    element_text1 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]")
    element_text2 = driver.find_element_by_xpath("//a[contains(., 'Text 1')]//following::a[contains(., 'Text 2')]") 
    
0 голосов
/ 04 ноября 2018

Просто найдите номер индекса этого пути x и добавьте 1, чтобы получить следующий смежный элемент xpath.

iterlist = iter( driver.get_all_elements_by_xpath ("//a[contains(., 'Text 1')]"))
while xpathFound == False :
    myElement = next(iterlist)       # get the next item
    xpathFound = True if myElement == text1xpath else False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...