如何在SeleniumWebDriver中使用JavaScript从脚本标记获取元素详细信息?

如何在SeleniumWebDriver中使用JavaScript从脚本标记获取元素详细信息?,javascript,java,selenium,automation,webdriver,Javascript,Java,Selenium,Automation,Webdriver,这个页面上有一个canvas元素,它是一个具有数字的图像,每当您刷新页面或在页面上执行任何需要重新加载的操作时,该数字都会更改 在源代码中,我看到的只是: <div class="row"> <div class="large-10 columns"> <canvas id="canvas" width="599" height="200" style="border:1px dotted;"></canvas>

这个页面上有一个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>
var canvas_el=document.getElementById('canvas');
var canvas=canvas_el.getContext('2d');
canvas.font='60px Arial';
canvas.strokeText('答案:19403',90112);

现在我的问题是如何在SeleniumWebDriver中编写javascript(我不太了解javascript),以便在脚本标记下获得这些细节(特别是strokeText),否则这些细节就不会出现在源代码中。我正在寻找使用JavascriptExecutor

的解决方案您使用
JavascriptExecutor
的想法是正确的。我找到了基本策略

final By SCRIPT=By.tagName(“脚本”);
列表脚本=新的WebDriverWait(驱动程序,5)
。直到(预期条件。由(脚本)延迟的所有元素的出现);
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
String query=“return document.getElementsByTagName(\“script\”)[参数[0]]。innerHTML;”;
Pattern p=Pattern.compile(“canvas.strokeText\\('Answer:\\d+');
模式p2=模式。编译(\\d+);
字符串编号=IntStream.range(0,scripts.size())
.mapToObj(i->(字符串)js.executeScript(查询,i))
.map(字符串->p.matcher(字符串))
.filter(m->m.find())
.map(m->p2.matcher(m.group()))
.filter(m->m.find())
.map(m->m.group())
.findFirst()
.orElse(空);
System.out.println(number);//打印页面上呈现的数字

以防万一你想知道我尝试了什么。我遇到了这个答案:但在这种情况下,他们得到的是链接到脚本标记本身的数据属性,而不是我想在这里得到脚本标记内部的属性。这是可行的!但我在这里有一个查询那是什么“参数[0]“。这是否意味着您将获得源代码中所有脚本标记中的第一个脚本标记?这是一种为javascript脚本提供参数的方法。请尝试以下操作:
js.executeScript(“alert(arguments[0]),“Mohit”,“Chouhan”);
然后是:
js.executeScript(“alert(arguments[1]),“Mohit”,“Chouhan”);
。”解释道
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