【问题标题】:Element not visible, selenium chromedriver, java元素不可见,硒 chromedriver,java
【发布时间】:2018-05-07 11:56:37
【问题描述】:

我正在尝试使用 Selenium,但遇到了无法找到任何东西的问题。

我的代码如下所示:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Flows {

    public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "/Users/mn/Desktop/project/turv/src/main/chromedriver");
        WebDriver driver = new ChromeDriver();

        String baseUrl = "http://anywhere.c3a.dk/";  
        driver.get(baseUrl);   

        driver.findElement(By.id("login")).click();
        driver.findElement(By.name("username")).sendKeys("placeholder");
        driver.findElement(By.name("password")).sendKeys("placeholder");

        driver.findElement(By.cssSelector("button.button.js-login-button")).click();

        System.out.println(driver.getTitle());

        driver.close();    
    }
}

当我尝试与网站交互时出现问题。简单的 driver.getTitle() 工作正常,但在尝试访问登录字段时出现错误。我尝试过使用By.nameBy.cssSelector。但两者都给出了相同的结果。我正在使用 Chrome 浏览器插件,所以记录了一些内容,然后我尝试将它所说的应用到我的代码中,但是当我运行它时出现以下错误:

Starting ChromeDriver 2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011) on port 31943
Only local connections are allowed.
May 07, 2018 1:06:18 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: element not visible
  (Session info: chrome=66.0.3359.139)
  (Driver info: chromedriver=2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011),platform=Mac OS X 10.13.3 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:26:55.152Z'
System info: host: 'cetreas-MBP', ip: 'fe80:0:0:0:c9e:2c67:1d27:4e0b%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.13.3', java.version: '1.8.0_161'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.38.552518 (183d19265345f5..., userDataDir: /var/folders/s7/lv2wt4t15cn...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 66.0.3359.139, webStorageEnabled: true}
Session ID: 6d1cb5352073e7f1071830edf5b40106
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:279)
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:83)
    at com.cetrea.flows.Flows.main(Flows.java:19)

我认为driver.findElement(By.id("login")).click(); 根本没有必要,只是我尝试过,因为它找不到另一个。

【问题讨论】:

  • 发布相关的 HTML。

标签: java selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

WebDriver 很可能会在元素可见之前尝试访问它。我们需要等待一段时间才能看到它。

试试:

driver.get("http://anywhere.c3a.dk/");

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.name("username"))).sendKeys("placeholder");
driver.findElement(By.name("password")).sendKeys("placeholder");

【讨论】:

  • 是的——看起来您在模板中找到了元素(不可见),而不是 Javascript 修改过的元素。
【解决方案2】:

尝试代替css选择器

driver.findElement(By.cssSelector("button.button.js-login-button")).click();

这个

driver.findElement(By.className("button js-login-button")).click();

【讨论】:

  • By.className() 在这里不起作用,因为您提供了两个类名。它会给你一个错误,“不允许复合类名”。更改定位器类型不会影响元素的可见性。使用当前定位器找到了该元素,它只是不可见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多