标签: xpath

如何消除Webdriver代码中的xpath?

我致力于自动化网站,我正试图找到一种方法来减少代码中xpath的使用.我的代码看起来像这样

    driver.findElement(By.xpath("//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input")).click();
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td")).getText();
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/div[2]/div/div/div[4]/div/div/div")).click();
    driver.findElement(By.xpath("//html/body/div[3]/div/div/div/div[2]/div/span/ul[2]/li[6]/a")).click();
    /*driver.findElement(By.xpath("//html/body/div/div/div/div[3]/div/div[2]/div[2]/table/tbody/tr/td[3]/table/tbody/tr/td[2]/em/button")).click();
    WebElement editUserForm = driver.findElement(By.cssSelector("iframe[src*='editUserForm']"));
Run Code Online (Sandbox Code Playgroud)

有什么办法可以减少这些xpath,这样我的代码看起来不会破旧吗?这里的一位成员建议我"请不要使用绝对xpath".这是什么意思 ?请帮忙.如果有任何链接可以帮助我,请告诉我.

是否可以创建一个将字符串转换为xpath指针的文件,然后我们可以在代码中使用该字符串?

selenium xpath webdriver selenium-webdriver

0
推荐指数
1
解决办法
5095
查看次数

如何将XML(String)转换为有效的文件?

我有XML作为字符串,我想将其转换为DOM文档,以便使用XPath解析它,我使用此代码将一个String元素转换为DOM元素:

public Element convert(String xml) throws ParserConfigurationException, SAXException, IOException{

        Element sXml =  DocumentBuilderFactory
                .newInstance()
                .newDocumentBuilder()
                .parse(new ByteArrayInputStream(xml.getBytes()))
                .getDocumentElement();


        return  sXml;

    } 
Run Code Online (Sandbox Code Playgroud)

但是,如果我想转换整个XML文件怎么办?我尝试了投射,但它没有工作,因为你无法从元素转换为文档(抛出异常):

例外情况:

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredElementImpl cannot be cast to org.w3c.dom.Document
Run Code Online (Sandbox Code Playgroud)

代码 :

public Document convert(String xml) throws ParserConfigurationException, SAXException, IOException{

        Element sXml =  DocumentBuilderFactory
                .newInstance()
                .newDocumentBuilder()
                .parse(new ByteArrayInputStream(xml.getBytes()))
                .getDocumentElement();


        return (Document) sXml;

    } 
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个但是没有用:

public Document convert(String xml) throws ParserConfigurationException, SAXException, IOException{

        Document sXml =  DocumentBuilderFactory
                .newInstance()
                .newDocumentBuilder()
                .parse(new ByteArrayInputStream(xml.getBytes()));


        return  sXml;

    } 
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?如果在XPath中有一种解析String而不是文档的方法,它也没问题.

java xpath document exception domxpath

0
推荐指数
1
解决办法
7244
查看次数

为什么我的xpath匹配不需要的元素?

我试图找到类"foo"的元素

<div id="foo1">
<div id = "foo2">
<div class = "foo">
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是我的xpath:

/div/div/div[contains(@class,'foo')]
Run Code Online (Sandbox Code Playgroud)

这是它发现的代码:

<div id="foo1">
<div id = "foo2">
<div class = "foo-err">
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)

该路径返回div class ="foo-err"元素

xpath

0
推荐指数
1
解决办法
26
查看次数

在同一个tr xpath python中找到包含td的xth td

我的页面有一个包含11列的表,给出了第2列的文本值,我想点击同一行的第11列(箭头按钮).

我的DOM看起来像这样:

<table id=”atab”  width=”100%” class=”at-class”>`  
    <thead>…</thead>  
    <tbody>  
        <tr>...</tr>  
        <tr>  
            <td>…</td>  
            <td>  
                <a href=”/abc/def/ghi/prop?id=1”>grp1</a>  
            </td>  
            <td>…</td>  
            <td>…</td>  
            <td>200</td>  
            <td>…</td>  
            <td>…</td>  
            <td>…</td>  
            <td>…</td>  
            <td>…</td>  
            <td>  
                <ul class=”dropwd”  
                    <li class>  
                        <input class=”a-act a-menu-button” type=”button” value=”^”  
                        <ul class=”sub_menu” style=”vis””>…</ul>  
                    </li>  
                </ul>  
            </td>  
        <tr>  
    <tbody>  
Run Code Online (Sandbox Code Playgroud)

这个工作(因为我刚刚从inspect元素中获取了xpath).我不能用它.

myxpath = "//*[@id='atab']/tbody/tr[2]/td[11]/ul/li/input”
myxpath.click()
Run Code Online (Sandbox Code Playgroud)

我需要使用contains,然后抓住兄弟(第11个位置,从我拥有的第9个位置).我为myxpath尝试了以下内容,但它无法找到该元素.我在其他地方使用过相同的格式,很好.唯一的区别是这次,我没有得到相邻的兄弟,而是第x个兄弟姐妹.

哪里 campg = grp1

//table[@class='at-class']//td[contains(text(),' " + campg + " ')]/following-sibling::td[9]/ul/li/input
//* [@id='atab']//td[contains(text(),' " + campg + " ')]/following-sibling::td[9]/ul/li/input
//* [@id='campaigns']//td[contains(text(),' " + campg +  " ')]/following-sibling::td[9]/ul/li/input[@type=’button’]
Run Code Online (Sandbox Code Playgroud)

我也尝试了其他组合.

python selenium xpath webdriver selenium-webdriver

0
推荐指数
1
解决办法
7002
查看次数

如何获取所有<img>标签,但使用xpath在id为footer的<div>下排除<img>标签?

你们知道我怎样才能获得所有img标签但是在使用xpath的id为footer的div下排除img标签?

目前要在html页面上获取所有img标签,我这样做: imgs = tree.xpath('//img')

但我想在一个id为footer的div下排除所有img标签,所以我正在做这个:

imgs = tree.xpath('//*[not(div[@id="footer"])]//img') < - 但这不起作用

html xpath web-scraping

0
推荐指数
1
解决办法
678
查看次数

在xPath中的单元格中选择多个元素之一

我正在使用Behat,我正在尝试选择一些表单元素.

我的HTML如下 - 基本上我有两个必填字段,一个是输入,一个是textarea,还有一个复选框.

<table class="table">
    <thead>
        <tr>
            <th>Delete</th>
            <th>Question</th>
            <th>Reference</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><input type="checkbox" name="delete" /></td>
            <td><textarea name="question" required="required"></textarea></td>
            <td><input type="text" required="required" name="reference" /></td>
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

获取表单元素的xpath选择器是:

 //table/tbody/tr/td/input
Run Code Online (Sandbox Code Playgroud)

这显然适用于输入 - 但是当我添加textarea并尝试检查它时,它找不到textarea,因为,它不是输入.

我试过这个://table/tbody/tr/td/(input or textarea)和使用"或",|等的几种变体我无法弄清楚如何指定多种类型的元素来尝试匹配.

提前致谢!:)

html php forms xpath behat

0
推荐指数
1
解决办法
2431
查看次数

究竟选择了哪个XPath查询?

我是Java中的XPath中的新手,我对这段代码有以下疑问,我发现在一个我必须工作的类中:

public String getApplicationParameter(ApplicationParameter parameter) {
    Element n;
    XPath xPath;

    try {
        xPath = XPath.newInstance("//root/settings/" + parameter.toString().replace("_", "-") );
        n = (Element) xPath.selectSingleNode(CONFIG_DOCUMENT);
    } catch (JDOMException e) {
        return "";
    }

    if(n == null){
        return "";
     }
     return n.getText();
  }
Run Code Online (Sandbox Code Playgroud)

前一个方法的ApplicationParameter输入参数是在同一个类中声明的枚举:

public enum ApplicationParameter {
    cache_size,
    restub_days,
    upload_processes,
    download_processes,
    upload_bandwidth,
    download_bandwidth
}
Run Code Online (Sandbox Code Playgroud)

CONFIG_DOCUMENTorg.jdom.Document中包含XML在其前面的方法工作.

所以我的疑问是:究竟选择这个XPath查询是什么?

xPath = XPath.newInstance("//root/settings/" + parameter.toString().replace("_", "-") );
n = (Element) xPath.selectSingleNode(CONFIG_DOCUMENT);
Run Code Online (Sandbox Code Playgroud)

TNX

安德里亚

java xml xpath jdom xml-parsing

0
推荐指数
1
解决办法
71
查看次数

当标签包含多个文本时,无法按文本选择标签

我正在驾驶自己疯狂.

我在表单中有三个表单字段:

  1. 客户:必填的下拉字段
  2. 重量:必填文本字段
  3. 状态:可选文本字段

每个元素都有该标签.必填字段的标签包含带星号的范围.

我在Chrome中使用Xpather.当我搜索这个时,我得到2个结果,当我得到3:

//*[contains(text(),'t')]
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义.

客户,正在工作:

<label for='customer-field'>
  <span class='required-marker'>*</span>
  Customer
  <input id='customer-field' type='text' />
</label>
Run Code Online (Sandbox Code Playgroud)

重量,这是工作:

<label class='control-label'>
  <span id='ctl01_requiredMarker' class='required-marker'>*</span>
  Weight
</label>
Run Code Online (Sandbox Code Playgroud)

状态,正在工作:

<label class='control-label'>
  Status
</label>
Run Code Online (Sandbox Code Playgroud)

对我有用的唯一解决方法是从Weight标签容器中删除所需的标记.但是,这并不能解释"客户"如何匹配.

值得注意的是:我正在尝试自动测试此页面,因此我无法真正删除该span标记.

这是怎么回事?和/或我该怎么办?

selenium xpath

0
推荐指数
1
解决办法
2305
查看次数

为什么//*[1]与(//*)[1]不同

我创建了两个文件,input.xmlformatter.xslt.

input.xml中:

<?xml-stylesheet type="text/xsl" href="formatter.xslt"?>
<div><span>1</span><span>2</span></div>
Run Code Online (Sandbox Code Playgroud)

formatter.xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html><head></head><body>
            <xsl:copy-of select="//*[1]"/>
            ,
            <xsl:copy-of select="(//*)[1]"/>
        </body></html>
    </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

然后我input.xml在Internet Explorer中打开,然后按下F12.我看到DOM树是这样的:

<html><head></head><body>
    <div><span>1</span><span>2</span></div><span>1</span>
    ,
    <div><span>1</span><span>2</span></div>
</body></html>
Run Code Online (Sandbox Code Playgroud)

为什么//*[1](//*)[1]复制不同的元素到输出文件?

xml xslt xpath xquery

0
推荐指数
1
解决办法
57
查看次数

在XPath/XQuery中替换为descendant-or-self

我正在寻找descendant-or-selfXPath/XQuery 的替代品.我们使用XQuery查询MarkLogic DB.我想要替换的原因descendant-or-self是我试图将50个值与XML结构中的属性值进行匹配.XML表示它有超过100万个节点,所以每次我必须做100万次后代才能找到完全匹配的节点,这是非常昂贵的操作.下面给出了基本的XML层次结构

A(@ val = 1) - > B(@ Val ="2") - > C(@ val ="3") - > A - > A - > A - > A(不确定)

上面我试图匹配val每个节点中的属性以找到确切的节点.由于我无法使用任何MarkLogic API来查找完全匹配的节点,因为A节点在不同级别发生,C因为我不知道XML在哪个级别匹配.(假设碎片在B级完成)

xpath xquery marklogic

0
推荐指数
1
解决办法
206
查看次数