Используя C# и Selenium, как я могу получить элементы и их значения, когда они не структурированы - PullRequest
0 голосов
/ 21 июня 2020

Используя C# и веб-драйвер Selenium для chrome, я пытаюсь получить

  1. каждое свойство, параметр и конфигурацию, которые находятся в теге Property .

  2. Их подпункт, который находится в подпункте.

  3. Их значение, которое находится в значении.

я. Разделитель не используется, поэтому я не могу разделить текст, если между каким-либо значением есть пробел. II. Свойство, Настройка и Конфигурация фиксированы; Бу номер подпункта и их значения не фиксируются. Так что их позиции продолжают меняться.

Какой подход мне выбрать?

Пример HTML приведен ниже.

<span class="list_props">
    <div style="height:8px;overflow:hidden;clear:left;"></div>
        <strong>Profile</strong>
            <strong style="font-style:italic;">Prop1:</strong>
                <a href="" title="P1-Profile Item 1">P1 Profile Item 1</a> 
            <strong style="font-style:italic;">Prop2:</strong> 
                <a href="" title="P2-Profile Item 1">P2 Profile Item 1</a> 
            <strong style="font-style:italic;">Prop3:</strong> 
                 <a href="" title="P3-Profile Item 1">P3 Profile Item 1</a>
                 <a href="" title="P3-Profile Item 2">P3 Profile Item 2</a>
    <div style="height:8px;overflow:hidden;clear:left;"></div>
        <strong>Settings</strong>
            <strong style="font-style:italic;">Setting1:</strong>
                <a href="" title="Setting1 Value1">Setting1 Value1</a>
    <div style="height:8px;overflow:hidden;clear:left;"></div>
        <strong>Config</strong>
            <strong style="font-style:italic;">Config:</strong>
                <a href="" title="config-1">config 1</a>
                <a href="" title="config-2">config 2</a> 
 </span>

Я пробовал кое-что , но лучшее, что я смог достичь, приводится ниже. Это не дает должного результата.

var props = c.FindElement(By.XPath("//*[@id='ajax-prop-details-" + objectid + "']"))
.FindElements(By.XPath(".//span[@class='list_props']/")).ToList();

foreach(var ca in props)
    {
        Console.WriteLine("> " + ca.Text);
        var attribs = ca.FindElements(By.XPath(".//following-sibling::")).ToList();
            foreach (var atrb in attribs)
                {
                Console.WriteLine(">> " + atrb.Text);
                }
    }

1 Ответ

1 голос
/ 22 июня 2020

Ваш XPaths немного сбился,

  • .//span[@class='list_props']/ следует заменить на .//span[@class='list_props']
  • .//following-sibling:: следует заменить на .//following-sibling::*

Я предлагаю протестировать ваши XPath в разделе поиска Chrome элемента inspect.

enter image description here

Given updates above, your code will be functional as demonstrated below:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Linq;

namespace FindingElements
{
    public class ProgramB
    {
        public static IWebDriver Driver = new ChromeDriver();

        private static void Test()
        {
            var props = Driver.FindElements(By.XPath("//span[@class='list_props']")).ToList();

            foreach (var ca in props)
            {
                Console.WriteLine("> "+ ca.Text); var attribs = ca.FindElements ( By.XPath (".// following-sibling :: *")). ToList (); foreach (var atrb в атрибутах) {Console.WriteLine (">>" + atrb.Text);}}} publi c stati c void Main (string [] args) {Driver.Navigate (). GoToUrl ("file: /// D: /temp/example.html"); Test ();}}} 

Говоря это, по-прежнему трудно достичь того, что вы изначально намеревались, потому что тег свойства не является фактическим html родительским элементом для своих подпунктов и его значений, а скорее является "логический" родительский элемент - это затрудняет, но все же позволяет найти его с помощью XPath, который обычно используется для определения местоположения элементов с использованием их родительских / дочерних отношений, а не элементов, которые предшествуют или следуют за другим элементом. Я бы посоветовал вам также взглянуть на сюда , который может помочь в достижении этого типа расположения элементов.

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