无法识别具有相对xpath或其他定位器的元素

时间:2018-04-04 04:54:38

标签: selenium selenium-webdriver xpath

我遇到一个问题,我无法在任何类型的定位器期望绝对xpath的网页上找到Element。以下是详细信息:

网址:https://semantic-ui.com/modules/dropdown.html#selection

必填元素截图: enter image description here

手动创建Xpath屏幕截图(请注意,我能够通过手动创建的xpath识别Web应用程序中的元素,但是相同的xpath在selenium代码中不起作用Element Screen shot

但是相同的xpath在selenium脚本中不起作用。Selenium Script

请注意我可以使用绝对xpath识别相同的对象 请帮助我理解这个原因。

这是代码:

public static WebDriver driver;

public static void main(String[] args) {


    driver= new FirefoxDriver();

    driver.manage().window().maximize();


    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    driver.get("https://semantic-ui.com/modules/dropdown.html");

    //Selection
    driver.findElement(By.xpath("//div[@class='ui selection dropdown upward']")).click();
    driver.findElement(By.xpath("//div[@class='menu transition visible']/div[text()='Female']")).click();

    System.out.println("Done");

6 个答案:

答案 0 :(得分:2)

这可能与您的第一个x路径有关。您可以尝试以下代码。它可能有用。

driver.findElement(By.xpath("//div[@class='ui selection dropdown']").click();
driver.findElement(By.xpath("//div[@class='menu transition visible']/div[text()='Male']").click();

答案 1 :(得分:1)

您在driver.FindElement XPath中缺少前面的通配符。

而不是driver.findElement(By.xpath("//div..."));,请driver.findElement(By.xpath("//*div..."));

目前,你的代码正在做的是告诉XPath定位器找到第一级div(不太可能,因为第一项几乎总是文档正文),但是“*”的通配符告诉它它可以在任何级别寻找div。

顺便说一句,请使用实际代码而非图片编辑您的答案,以便其他具有相同问题的人可以更轻松地找到解决方案。

答案 2 :(得分:0)

Longshot:

您正在使用Chrome查看来源,但Selenium正在使用Firefox。

有可能在两个浏览器之间呈现不同的源。具体来说,您的xpath依赖于类的完全匹配。我知道FireFox因修改源输出而臭名昭着。

我还没有完成任何测试,但如果课程顺序不同并且完全匹配失败,我也不会感到惊讶。

如果是这种情况,有两种解决方案:

  1. 不要进行一次完全匹配(xpath ="")而是混合使用with&&& (包含ui&&包含选择和&&下拉列表)
  2. 不要依赖控制台选项卡的输出。相反"查看页面来源"并查看实际发送的内容而不是浏览器正在解释的内容

答案 3 :(得分:0)

首先找到下拉容器元素,然后用它来查找自己的后代,比如选项等。

driver.get("https://semantic-ui.com/modules/dropdown.html");

// find dropdown container element
WebElement dropdownWrapper = driver.findElement(
    By.xpath("//div[@class='html']/div[input[@name='gender']]"));

// expand drop down options by click on the container element
dropdownWrapper.click();
// or click the down arrow
dropdownWrapper.findElement(By.css('i')).click();

// select option
dropdownWrapper.findElement(By.xpath(".//div[text()='Female']")).click();

答案 4 :(得分:0)

要找到文字为性别的元素并选择女性选项,您可以使用以下定位器策略

代码块:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("https://semantic-ui.com/modules/dropdown.html#selection");
driver.findElement(By.xpath("//div[@class='another dropdown example']//div[@class='ui dropdown selection']")).click();
driver.findElement(By.xpath("//div[@class='another dropdown example']//div[@class='ui dropdown selection active visible']//div[@class='menu transition visible']//div[@class='item' and contains(.,'Female')]")).click();
System.out.println("Gender Female selected.");

控制台输出:

Gender Female selected.

答案 5 :(得分:0)

这可能有助于明确选择器的一般工作方式:

  1. .(dot):开始的点代表当前节点。它告诉我们处理将从当前节点开始。

  2. 。 .(双点):它将选择当前节点的父节点。例如,//table/。 .将返回 div 元素,因为 div 是 table 元素的父元素。

  3. ‘*’:用于选择从当前节点降序的所有元素节点。例如:

/table/*:它会选择一个表格元素的所有子元素。

///*:它将选择文档中的所有元素。

//*[@id = ‘username’]:它将选择文档中具有名为“id”且指定值为“username”的属性的任何元素。

  1. @:表示选择id、name、className等属性,例如:

@id:它会选择文档中所有用 id 属性定义的元素。不管它是在文档中的什么地方定义的。 //img/@alt:它将选择所有使用@alt 属性定义的img 元素。 //td[@*]: 它会选择所有具有任何属性的 td 元素。

这是文章的链接: https://www.scientecheasy.com/2020/07/selenium-xpath-example.html/