如何通过SeleniumWebDriver和Java根据HTML单击带有文本作为注销的元素

时间:2018-07-12 15:51:12

标签: java selenium selenium-webdriver xpath webdriver

在该网站的移动版本上,我需要单击“注销”类别,但是xpath不起作用(xpath在列表中的第一个类别上单击),试图使用此示例

WebElement logout = driver.findElement(By.xpath("//li[contains(@class, 'link logout hidden-md-up icon-logout')]"));
logout.click();

但是它仍然无法正常工作。也许有人知道如何解决这个问题?

带有代码示例的屏幕(突出显示我要单击的类别) enter image description here

6 个答案:

答案 0 :(得分:0)

两件事:

  1. 在您的示例中,您的xpath指向<ul>,我猜单击它与单击其下的第一个<li>相同。
  2. 您也可以尝试引用文本。

    WebElement logout = driver.findElement(By.xpath("//li[contains(@class,'logout') and text()[contains(.,'Logout')]]"

答案 1 :(得分:0)

要单击文本为登出的元素,您需要诱使 WebDriverWait 使元素可点击,并且可以使用以下命令解决方案:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//ul[@class='account-action-list']//li[@class='link logout hidden-md-up icon-logout']/span"))).click();

答案 2 :(得分:0)

尝试使用:

Eg: Main url: www.inhouseknowlegeTree.net. 
Subsequent portal urls =
a. www.inhouseknowlegeTree.net/supervisor or  www.supervisor.inhouseknowlegeTree.net
b. www.inhouseknowlegeTree.net/worker or  www.worker.inhouseknowlegeTree.net
c. www.inhouseknowlegeTree.net/manager or  www.manager.inhouseknowlegeTree.net

答案 3 :(得分:0)

尝试一下:

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[contains(., 'Logout')"))).click();

答案 4 :(得分:0)

尝试使用链接文本方法或部分链接文本方法。

driver.findElement(By.linkText("Logout")).click();

driver.findElement(By.partialLinkText("Logout")).click();

确保参数文本与DOM中的文本匹配

答案 5 :(得分:-1)

定位器有两个问题:

  1. 正如所指出的那样:您的定位符是ul[contains(@class, '...')],但是这些分类都在li元素上。因此找不到您的元素。
  2. 在HTML中,class属性是用空格分隔的类的列表,并且不能保证列表中的顺序。您可以使用WebDriver的By.className()定位这些类中的任何一个;例如driver.findElement(By.className("logout"))

即使这些可能仍不能解决您的问题。您可能需要定位span下的li节点。

更新:

By.xpath("//li[contains(@class, 'link')这样的选择器几乎肯定不会起作用,因为页面中可能有多个类为link的元素。在这种情况下,Selenium会选择第一个,很可能不是您想要的那个。

为了帮助我们获得特定的选择器,您必须提供更多的HTML。