硒element.click()不起作用(不单击)

时间:2019-05-09 12:56:52

标签: selenium

String selector = ".rmcAlertDialog .buttons :first-child";
RemoteWebElement selection = (RemoteWebElement) driver.findElement(By.cssSelector(selector));
WebDriverWait wait = new WebDriverWait(driver, 60);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(selection));
if (element == selection) selection.click();

但是有问题的元素(按钮)没有响应点击。

如果我手动单击该按钮,它将起作用,因此它不是出现故障的网页,而是自动化。

我已经通过比较按钮的文本内容来确认按钮在那里。

已更新以进行澄清

此代码适用于(或适用于)大多数按钮。该代码来自正在解析的脚本解释器:-

select ".rmcAlertDialog .buttons :first-child" click

此代码在chrome / selenium / chromedriver的最新版本之前有效。

该代码现在对一些按钮不起作用。

selection.click()正在被调用(在调试器中验证),因为元素将始终等于选择,因此它不起作用。

.buttons是按钮的容器div的类名

2 个答案:

答案 0 :(得分:2)

我认为失败的主要原因是因为您的if语句永远不会正确。我从来没有做过这样的比较,但是您可以大大简化代码,但仍然可以达到预期的效果。

一些建议:

  1. 不要将定位符定义为String,而应将它们定义为ByBy类就是为此类任务定义的,它使在MUCH中使用和传递它们变得更加容易。

    String selector = ".rmcAlertDialog .buttons:first-child";
    

    会变成

    By locator = By.cssSelector(".rmcAlertDialog .buttons:first-child");
    

    请注意S Ahmed在回答中指出的更正。

  2. 您无需查找元素即可等待其被单击。有一个需要By定位符的重载,请改用它。

    RemoteWebElement selection = (RemoteWebElement) driver.findElement(By.cssSelector(selector));
    WebDriverWait wait = new WebDriverWait(driver, 60);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(selection));
    

    成为

    WebElement element = new WebDriverWait(driver, 60).until(ExpectedConditions.elementToBeClickable(locator));
    
  3. 跳过RemoteWebElementWebElement的比较。我认为这行不通,而且也没有必要。您的定位器将一致地定位相同的元素。

因此您的最终代码应类似于

By locator = By.cssSelector(".rmcAlertDialog .buttons:first-child");
new WebDriverWait(driver, 60).until(ExpectedConditions.elementToBeClickable(locator)).click();

答案 1 :(得分:1)

选择器未定向到具有按钮类的元素。选择器中.button:first-child之间有一个空格。删除空间。给定的选择器正在搜索带有按钮类的标签的子元素。但是我假设您尝试单击按钮类的第一个元素,而不是按钮类元素的子节点。 使用这个:

String selector = ".rmcAlertDialog .buttons:first-child";