selenium 如何在Java中将HTML文本附加到div标签

k7fdbhmy  于 2022-12-13  发布在  Java
关注(0)|答案(1)|浏览(230)

我在JavaSeleniumWebdriver中动态生成了一个HTML文件,这个HTML文件有两个div标签,每个标签都有自己唯一的id属性。
我想在代码的后面根据它们的id动态地将HTML文本添加到这些div标记中。
能否做到这一点?如果是,有人能为我指出如何实现这一点的正确方向吗?如果否,实现这一点的替代方法是什么?
我正在努力解决这种情况。我真的需要能够基于div标签动态地将数据附加到HTML页面。
提前感谢!

public void createsummaryfile(String report,String path) throws IOException{            
    File summary;       
    summary = new File(filepath);
    if(!summary.exists()){
        summary.createNewFile();
    }
    BufferedWriter bw = new BufferedWriter(new FileWriter(summary));
    bw.write("<!DOCTYPE html>");
    bw.write("<html><head><h1 align=center>EDC Reports Test Case Execution Summary</h1>");
    bw.write("<style>#report_table{height: 300px;left: 1em;position: relative;top: 5em;width: 300px;}#report{height: 300px;left: 20em;position: relative;top: -15em;width: 300px;}</style></head>");
    bw.write("<body><div id=report_table><table align=center border=1><tbody><tr><th>Report Name</th></tr></div>");
    bw.write("<body><div id=report_display></div>");
    bw.write("</html>");        
    bw.close();
}

public void populate_summary(String report,String path) throws IOException{     
    File summary_report = new File(filepath);
    BufferedWriter br = new BufferedWriter(new FileWriter(summary_report,true));        
    //Here I need to access the div tags by their id's and start appending data     
}
bn31dyow

bn31dyow1#

通过创建DOM树并在其中搜索,可以在HTML文档中找到具有特定ID的div-tag。
首先,您需要创建文档的DOM表示:

public static String addToDivWithID(String htmlDocPath, String divID, String dataToAppend)
        throws ParserConfigurationException, IOException, SAXException, TransformerException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(htmlDocPath);

    Element elementWithID = findDiv(divID, doc.getDocumentElement());

    Element contentToAppend = builder
            .parse(new ByteArrayInputStream(dataToAppend.getBytes()))
            .getDocumentElement();

    elementWithID.appendChild(contentToAppend);

    return domToString(doc);
}

在本例中,我使用此方法查找所需的div元素:它正在执行递归查找(实现可能看起来更好一点)

public static Element findDiv(String id, Element element) {

    if( id.equals(element.getAttribute("id")) ) {
        return element;
    }

    NodeList innerDivs = element.getElementsByTagName("div");

    for(int i = 0; i < innerDivs.getLength(); i++) {
        Element current = (Element) innerDivs.item(i);

        if( id.equals(current.getAttribute("id")) ) {
            return current;
        }

        Element possibleChildWithID = findDiv(id, current);

        if(possibleChildWithID != null) {
            return possibleChildWithID;
        }
    }

    return null;
}

找到正确的元素后,可以使用以下行添加新内容(已在第一个方法中):

Element contentToAppend = builder
            .parse(new ByteArrayInputStream(dataToAppend.getBytes()))
            .getDocumentElement();

您可以找到有关将XML字符串附加到DOM元素here的更多信息。
然后,您必须将DOM文档转换回它的字符串表示形式,方法如下:

public static String domToString(Document doc) throws TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    StringWriter writer = new StringWriter();
    transformer.transform(new DOMSource(doc), new StreamResult(writer));
    String output = writer.getBuffer().toString().replaceAll("\n|\r", "");

    return output;
}

有关将DOM文档转换为字符串here的详细信息。

最后,我个人的一个问题是,你不应该这样处理你的HTML文档!如果你想在特定的div中添加内容,在服务器端使用JSP,如下所示:

<html>
    <body>
        <div id="first">
            <%
                String first = Foo.getFirstDivStuff();
            %>
            <%= first %>
        </div>
        <div id="second">
            <%
                String second = Foo.getSecondDivStuff();
            %>
            <%= second %>
        </div>
    </body>
</html>

如果您要修改已经传送到客户端的HTML内容,请在服务器上使用 AJAX 和适当的JSP或Servlet。

相关问题