我致力于自动化网站,我正试图找到一种方法来减少代码中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指针的文件,然后我们可以在代码中使用该字符串?
我有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而不是文档的方法,它也没问题.
我试图找到类"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"元素
我的页面有一个包含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)
我也尝试了其他组合.
你们知道我怎样才能获得所有img标签但是在使用xpath的id为footer的div下排除img标签?
目前要在html页面上获取所有img标签,我这样做:
imgs = tree.xpath('//img')
但我想在一个id为footer的div下排除所有img标签,所以我正在做这个:
imgs = tree.xpath('//*[not(div[@id="footer"])]//img') < - 但这不起作用
我正在使用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)和使用"或",|等的几种变体我无法弄清楚如何指定多种类型的元素来尝试匹配.
提前致谢!:)
我是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_DOCUMENT是org.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
安德里亚
我正在驾驶自己疯狂.
我在表单中有三个表单字段:
每个元素都有该标签.必填字段的标签包含带星号的范围.
我在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标记.
这是怎么回事?和/或我该怎么办?
我创建了两个文件,input.xml和formatter.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]复制不同的元素到输出文件?
我正在寻找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级完成)