Получить абсолютный xpath всех текстовых узлов под узлом - PullRequest
1 голос
/ 06 мая 2019

У меня есть xpath, который создается путем добавления 3 строк

path_prefix='(.//tr|.//div[not(ancestor::div)][not(descendant::tr)])[3]'
r1=u'Company  (Name in which such subsidiary conducts business if other than corporate name):  '
path=path=path_prefix+"//*[text()="+"'"+r1+"'"+"]"

Когда я запускаю этот путь в браузере, он прекрасно работает. Но когда я пытаюсь запустить это на селене с помощью execute_javascript, он дает нулевой элемент.

stg="var element=document.evaluate("+'"'+path+'"'+",document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;return element.getBoundingClientRect()"
driver.execute_script(str(stg))

Кроме того, я проверял, когда я запускаю код, мой элемент stg выглядит следующим образом. (добавляется дополнительный '\', но он все равно отлично работает в браузере)

stg='var element=document.evaluate("(.//tr|.//div[not(ancestor::div)][not(descendant::tr)])[3]//*[text()=\'Company  (Name in which such subsidiary conducts business if other than corporate name):  \']",document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;return element.getBoundingClientRect()'

Редактировать: (Комментарий от ОП)

главная проблема. Я хочу извлечь все текстовые узлы, присутствующие на HTML-странице и их xpath. xpath должен начинаться с html / / / .... Есть ли лучший способ или какая-либо библиотека, которая уже существует.

1 Ответ

0 голосов
/ 14 мая 2019

Если вы хотите получить абсолютные xpath всех текстовых узлов в html, я бы посоветовал использовать Javascript будет намного быстрее и проще. Вы просто должны игнорировать "↵" в вашем скрипте.

Вот решение Javascript, реализованное в python.

Примечание. Вывод массива будет содержать пару "текст - absolutexpath".

  # this is the custom javascript developed to get the absolute xpaths for all 
  # textnodes under given element using TreeWalker
  jsFunction = """window.getAbsoluteXpathsUnder =function(el){
  var nText ='';
  var aPath ='';
  var elm="";
  var tNode, aPaths=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
  while(tNode=walk.nextNode()){
        nText = tNode.textContent;
        if (nText.trim()!=""){
        aPath='';
        elm = tNode.parentNode;
        while (elm.tagName!='HTML'){ aPath = elm.tagName + "/" +aPath; elm=elm.parentNode;}
         aPaths.push(nText + " - HTML/" + aPath);
        }
  }
  return aPaths;
};"""
# Run the Javascript function
driver.execute_script(jsFunction)
# get the all text node absolute xpaths under first "div table"
aXpaths = driver.execute_script("return getAbsoluteXpathsUnder(arguments[0])",driver.find_elements_by_css_selector('div table')[0])
print(aXpaths)

А вот и вывод . enter image description here

У вас есть 3 такие таблицы на странице, которые вам, возможно, придется вызвать aXpaths = driver.execute_script("return getAbsoluteXpathsUnder(arguments[0])",ele) 3 раза или использовать цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...