2016-09-20 133 views
0

我有一个HTML页面(使用Firefox和/或Chrome打开),并且我试图找到正在尝试点击该网页的(图片)元素的正确XPath。我使用Selenium Automation在C#中编写代码。下面是当我右键单击并选择检查时该元素的外观:C#中的Selenium XPath未找到错误#

(实际网站太长,所以我用{网站}和{不同网站}对它进行了修改)。

编辑:对不起,我忘了,但{网站}是动态的。 {不同网站}是静态的。

<a href="https://{website}"> 
<img border="0" alt="open now" src="https://{different-website}.gif"> 
</a> 

我想用我的自动点击IMG,但一切我尝试失败的自动化,并说“找不到元素”。我注意到,试图点击的img嵌套在上面的{a}元素中。也许这就是为什么选择和点击非常困难。 我试过的东西,如:

driver.FindElement(By.XPath("//a[starts-with(@href='https://www.{website}')]")).Click(); 

driver.FindElement(By.XPath("//a[contains(@href='https://www.{website}')]")).Click(); 

driver.FindElement(By.XPath("//img[(@src,'img1935.gif')]")).Click(); 

driver.FindElement(By.XPath("//img[(@src,'img1935.gif')]/../a")).Click(); 

driver.FindElement(By.XPath("//a[not(@href)/img/@src | //a[img]/@href")).Click(); 

driver.FindElement(By.XPath("//a[@alt='open now']/@src")).Click(); 

driver.FindElement(By.XPath("//img[@alt='open now']/@src")).Click(); 

所有这些返回“找不到元素”和我卡上还有什么我应该做的,或尝试。任何建议将不胜感激。非常感谢你。

回答

0

许多XPath不会找到您要查找的内容。你有没有尝试过一些简单的东西,如

driver.FindElement(By.XPath("//a/img[@alt='open now']")).Click(); 

如果这不起作用,你需要提供更多信息或链接到页面。

+0

这不起作用,我也不能实际给出的网站链接,因为它的分类(因此动态行为),但我真的可以看到,当我检查网页是我想要点击嵌套在一个段落内。感谢您也试图帮助 – CRich

+0

试试这个...转到您正在使用的页面并在开发控制台中键入$ x(“// a/img [@ alt ='open now']”)'...它返回什么? – JeffC

+0

嗯...我有3个人在页面上输入后,我有3个相同的图像与精确的XPath。也许这就是Selenium无法找到它的原因。但是因为我有3个,它不应该找到其中的一个吗? – CRich

0

尝试//a[@href="https://{website}"]/img[1]

  • 所有a元素(其中HREF = “HTTP:// {网站}”)
  • 然后选择这些元素的第一img子元素

你可以test it here - 该网站也会提供建议。

我发现this page试图找出XPath

+0

感谢您的回复,但这不适用于动态{网站},我试过。 – CRich

0

如果您有动态网址的,你应该避免使用在selector.You固定路径可以使用类似时非常有用:

//a[contains(@href, 'part_of_href_value')] 

如果链接转换为可以使用类似不同的网站:

//a[contains(@href, 'part_of_href_value1') or contains(@href, 'part_of_href_value2') or contains(@href, 'part_of_href_value3')]

你ç使用href的任何部分。您可以调整为图像也上述选择,与img@href@src

实例替换a: 我有HREF的2个链接:
href= https://www.example1.com/blabla/page
href= http://www.second-example.org/bla/page-s

要选择这两个环节,我使用例如字既然是常见的有:
//a[contains(@href, 'example')]

要选择由不同部件/词语两个链路:
//a[contains(@href, 'blabla/page') or contains(@href, 'bla/page')]

+0

我也试过,它没有通过使用包含找到元素。此外,无论何时我输入网站时都会包含如下内容:“// a [包含(@ href,'https:// {网站}')]”,“//”会使整个网站链接变为蓝色。我不知道它是否因为“//”而找不到元素。我还假设在使用包含时,我必须从“https://”开始,但不必输入整个网站地址。那是对的吗? – CRich

+0

不可以。当您使用包含时,您可以从任何地方开始并复制您需要的零件。 – lauda

+0

我已经尝试过不使用“https://”,我也没有运气能够找到元素。如://a[contains(@href,'https://www.google.com/search/help')]“给了我没有运气。另外,我尝试这样:// a [contains(@ href,'https:// search/help')]“”这也给我带来了好运 – CRich