2015-12-28 3 views
3
browser = webdriver.Firefox() 
browser.get("http://www.example.com/admin/orders") 
total_images = len(browser.find_elements_by_xpath('/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]//img')) 
for i in range(1,total_images): 
      compiledData['item_url'] = browser.find_elements_by_xpath(browser.xpath('/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]//img[')+str(']')) 

Теперь мне нужен фактический путь элемента. Как вы можете видеть, я просматриваю диапазон изображений в динамическом коде xpath. Теперь, если я нахожусь в петле, и там мне нужно точное xpath этого тока динамически идентифицированного изображения xpathSelenium Python Поиск фактического xPath текущего узла в цикле

Например, если он работает для первого изображения, то он должен дать:

/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]/img[1]

если он работает во второй раз, то:

/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]/img[2]

Я хочу, чтобы извлечь это фактическоеэтого текущего узла в пределах этого цикла

Теперь что-то вроде PHP одно:

$breakup = $xpath->query('/html/body/div[5]/div[3]/div[1]/div[3]//*[text()="Package total"]'); 
if($breakup->length != 0) 
{ 
    $breakupPath = substr($breakup->item(0)->getNodePath(), 0, -2)."2]"; 
    $orderData['total'] = str_replace("Rs.", "", trim($xpath->query($breakupPath)->item(0)->nodeValue)); 
} 

Где, $breakup->item(0)->getNodePath() дает реальную xPath из динамически идентифицированной опции xPath

ответ

3

Один здесь было бы использовать одна из функций генерации XPath предлагается здесь:

и выполнять их с помощью execute_script(). Пример кода:

from selenium import webdriver 


driver = webdriver.Firefox() 
driver.get("http://www.w3schools.com/") 


driver.execute_script(""" 
window.getPathTo = function (element) { 
    if (element.id!=='') 
     return 'id("'+element.id+'")'; 
    if (element===document.body) 
     return element.tagName; 

    var ix= 0; 
    var siblings= element.parentNode.childNodes; 
    for (var i= 0; i<siblings.length; i++) { 
     var sibling= siblings[i]; 
     if (sibling===element) 
      return window.getPathTo(element.parentNode)+'/'+element.tagName+'['+(ix+1)+']'; 
     if (sibling.nodeType===1 && sibling.tagName===element.tagName) 
      ix++; 
    } 
} 
""") 

element = driver.find_element_by_class_name("w3-fluid") 

generated_xpath = driver.execute_script("return window.getPathTo(arguments[0]);", element) 
print(generated_xpath) 

Другим вариантом было бы получить source of a page и кормить его lxml.html HTML parser, который имеет getPath() метод:

from selenium import webdriver 
import lxml.html 


driver = webdriver.Firefox() 
driver.get("http://www.w3schools.com/") 

tree = lxml.html.fromstring(driver.page_source) 
root = tree.getroottree() 

driver.close() 

element = tree.xpath("//*[@class='w3-fluid']")[0] 
print(root.getpath(element)) 
+0

Спасибо за ответ, проверка Лемм и обновит вас. –

+0

@DjangoAnonymous Итак, вы проверили, стоит ли этот ответ вашей щедрости? –

Смежные вопросы