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的类名
答案 0 :(得分:2)
我认为失败的主要原因是因为您的if
语句永远不会正确。我从来没有做过这样的比较,但是您可以大大简化代码,但仍然可以达到预期的效果。
一些建议:
不要将定位符定义为String
,而应将它们定义为By
。 By
类就是为此类任务定义的,它使在MUCH中使用和传递它们变得更加容易。
String selector = ".rmcAlertDialog .buttons:first-child";
会变成
By locator = By.cssSelector(".rmcAlertDialog .buttons:first-child");
请注意S Ahmed在回答中指出的更正。
您无需查找元素即可等待其被单击。有一个需要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));
跳过RemoteWebElement
和WebElement
的比较。我认为这行不通,而且也没有必要。您的定位器将一致地定位相同的元素。
因此您的最终代码应类似于
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";