Как получить подробную информацию об элементе из тега скрипта, используя JavaScript в Selena Webdriver? - PullRequest
0 голосов
/ 10 мая 2018

Моя проблема лежит на этой странице

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

В исходном коде я вижу только это:

<div class="row">
      <div class="large-10 columns">
        <canvas id="canvas" width="599" height="200" style="border:1px dotted;"></canvas>
      </div>
    </div>

Итак, вкратце, я ничего не могу сделать с этой информацией на внешнем html, но когда я пошел враздел сети и увидел код ответа, в котором я нашел этот код, который использует javascript:

    <script>var canvas_el = document.getElementById('canvas');
var canvas = canvas_el.getContext('2d');
canvas.font = '60px Arial';
canvas.strokeText('Answer: 19403',90,112);
</script>

Теперь моя проблема заключается в том, как я могу написать javascript (я не знаю так много о javascript) в веб-драйвере selenium дляполучить эту информацию (в частности, strokeText) под тегом script, которого нет в исходном коде.Я ищу решение с использованием JavascriptExecutor .

1 Ответ

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

У вас была правильная идея с использованием JavascriptExecutor. Я нашел базовую стратегию здесь .

final By SCRIPT = By.tagName("script");

List<WebElement> scripts = new WebDriverWait(driver, 5)
        .until(ExpectedConditions.presenceOfAllElementsLocatedBy(SCRIPT));

JavascriptExecutor js = (JavascriptExecutor) driver;
String query = "return document.getElementsByTagName(\"script\")[arguments[0]].innerHTML;";     
Pattern p = Pattern.compile("canvas.strokeText\\('Answer: \\d+'");
Pattern p2 = Pattern.compile("\\d+");

String number = IntStream.range(0, scripts.size())
        .mapToObj(i -> (String)js.executeScript(query, i))
        .map(string -> p.matcher(string))
        .filter(m -> m.find())
        .map(m -> p2.matcher(m.group()))
        .filter(m -> m.find())
        .map(m -> m.group())
        .findFirst()
        .orElse(null);
System.out.println(number);  // prints the number rendered on the page
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...