Selenium ChromeDriver: увеличение времени получения значения элемента Anchor - PullRequest
0 голосов
/ 09 мая 2018

Это на самом деле продолжение предыдущего вопроса , но, поскольку вопрос был довольно длинным, и ответ был дан уже за награду, боюсь, он не привлечет к нему внимания, даже хотя я добавил это в конец текста. Итак, менеджеры - я надеюсь, что вы примете наилучшее решение для правильной публикации этого вопроса - здесь или еще в предыдущем вопросе.

На этот раз у меня увеличивается время зацикливания элементов привязки. То есть каждый вызов func () занимает больше времени. Цикл имеет только 5 итераций.

void func(WebElement anchorsElement){

    List<WebElement> anchors = anchorsElement.findElements(By.tagName("a"));

    for (WebElement a : anchors) {

        if (a.getAttribute("class").indexOf("a") > 0)
            values.add("A");
        else if (a.getAttribute("class").indexOf("b") > 0)
            values.add("B");
        else if (a.getAttribute("class").indexOf("c") > 0)
            values.add("C");

    }
}

На этот раз меня не интересует текст, но мне нужно узнать имена классов. Вот почему я не мог использовать решение, данное мне в предыдущем вопросе.

Это пример элемента привязки:

<div class="meetings-8 ">
    <a class="Call-bg Call-s glib-tvene-dW1eVj25 glib-thepart-WdKOwxDM-Wtn9Stg0 glib-partnames-alal;Ashkelon" title="[b]Next meeting:[/b]
alal - Ashkelon
13.05.2018">&nbsp;</a>
    <a class="Call-bg a glib-tvene-j1TJiPdn glib-thepart-Wtn9Stg0-2XrRecc3 glib-partnames-Ashkelon;kdkdkdkd" title="[b]991818&amp;nbsp;[/b](Ashkelon - kdkdkdkd)
09.05.2018">&nbsp;</a>
    <a class="Call-bg b glib-tvene-lhJEIDIa glib-thepart-Wtn9Stg0-xxxpBZl2 glib-partnames-Ashkelon;ieieie" title="[b]920032&amp;nbsp;[/b](Ashkelon - ieieie)
06.05.2018">&nbsp;</a>
    <a class="Call-bg a glib-tvene-IBZf2hYI glib-thepart-Cxq57r8g-Wtn9Stg0 glib-partnames-west-ham;Ashkelon" title="[b]882772&amp;nbsp;[/b](mcmcmcmc - Ashkelon)
29.04.2018">&nbsp;</a>
    <a class="Call-bg a glib-tvene-0U3juSVT glib-thepart-Wtn9Stg0-K6xezbY7 glib-partnames-Ashkelon;kKkssks" title="[b]001991&amp;nbsp;[/b](Ashkelon - kKkssks)
22.04.2018">&nbsp;</a>
    <a class="Call-bg Call-bg-last a glib-tvene-ddkDE7Ld glib-thepart-UDg08Ohm-Wtn9Stg0 glib-partnames-kokok;Ashkelon" title="[b]722726&amp;nbsp;[/b](kokok - Ashkelon)
14.04.2018">&nbsp;</a>
</div>

Можете ли вы помочь, пожалуйста?

1 Ответ

0 голосов
/ 10 мая 2018

Как и ваш предыдущий вопрос, вы можете выполнить JavaScript на веб-странице, чтобы совершать меньше звонков по проводам:

var parent = arguments[0];
// ^ JavaScript is executed as a function call.
//   We need to get the parent element passed as an argument.

Array.from(parent.getElementsByTagName('a'))
//         ^ Get all the "a" tags in the parent
// ^ and convert the HTMLCollection to an Array so we can use reduce
.reduce(
// ^ Reduce will call the following callback on each element with an "accumulated" value (your result) and the current element of the array. The first value of the accumulator is the initial value we provide as the second argument
  (acc, anchor) => {
    if (anchor.classList.contains("a")) {
    //        ^ The classList.contains method will check if the anchor has the class "a" applied.
      acc.push("A");
      // ^ Add "A" to the accumulator
    }
    if (anchor.classList.contains("b")) { acc.push("B"); }
    if (anchor.classList.contains("c")) { acc.push("C"); }
    return acc;
    // ^ Return the accumulated value for the next iteration
  },
  [],
  // ^ Initial value of the accumulator
);

Упрощенно, JavaScript:

Array.from(arguments[0].getElementsByTagName('a'))
  .reduce((acc, { classList }) => {
    classList.contains("a") && acc.push("A");
    classList.contains("b") && acc.push("B");
    classList.contains("c") && acc.push("C");
    return acc;
  }, []);

Что вы можетезаверните звонок как ваш предыдущий вопрос:

public ArrayList<?> func(WebElement element)
{
    final String JS_TRANSFORM_ANCHOR_CLASSES_TO_VALUES = 
        "return Array.from(arguments[0].getElementsByTagName('a'))\n" +
        "  .reduce((acc, { classList }) => {\n"
        "    classList.contains(\"a\") && acc.push(\"A\");\n"
        "    classList.contains(\"b\") && acc.push(\"B\");\n"
        "    classList.contains(\"c\") && acc.push(\"C\");\n"
        "    return acc;\n"
        "  }, []);\n"

    WebDriver driver = ((RemoteWebElement)table).getWrappedDriver();
    Object result = ((JavascriptExecutor)driver).executeScript(JS_TRANSFORM_ANCHOR_CLASSES_TO_VALUES, element);
    return (ArrayList<?>)result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...