【问题标题】:How to get element details from script tag using JavaScript in selenium webdriver?如何在 selenium webdriver 中使用 JavaScript 从脚本标签中获取元素详细信息?
【发布时间】:2018-10-20 21:46:48
【问题描述】:

My problem lies on this page

此页面上有一个画布元素,它是一个图像,其编号会在您刷新页面或在页面上执行任何需要重新加载的操作时更改。

在源代码中我看到的只有这个:

<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>

现在我的问题是如何在 selenium webdriver 中编写 javascript(我不太了解 javascript)以在脚本标签下获取此详细信息(特别是 strokeText),否则源代码中不存在这些详细信息。我正在寻找使用 JavascriptExecutor 的解决方案。

【问题讨论】:

  • 以防你想知道我尝试了什么。我遇到了这个答案:stackoverflow.com/questions/14904378/… 但在这种情况下,他们正在获取链接到脚本标签本身的数据属性,这与我想获取脚本标签内的属性不同。

标签: javascript java selenium automation webdriver


【解决方案1】:

您使用JavascriptExecutor 的想法是正确的。我找到了基本策略here

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

【讨论】:

  • 有效!但我在这里有一个疑问,'arguments[0]' 是什么。这是否意味着您正在获取源代码中所有脚本标签中的第一个脚本标签?
  • 这是一种为 javascript 脚本提供参数的方法。试试这个:js.executeScript("alert(arguments[0])", "Mohit", "Chouhan");,然后这个:js.executeScript("alert(arguments[1])", "Mohit", "Chouhan");。解释here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2014-06-19
相关资源
最近更新 更多