селен + phantomJS веб-элементы внутренние исключения - PullRequest
0 голосов
/ 03 июля 2018

Я выполняю очистку веб-страницы, используя jrel 8.0_144, selenium 3.5.0 и phantomJS driver 2.1.1.

Для элемента ввода с идентификатором «количество», код:

public boolean enterQuantity (WebDriver driver, String id, int qty)
{
    boolean result = false;
    long delay = 30000;   // should be ample!
    try
    {
        WebDriverWait wait1 = new WebDriverWait (driver, delay);
        wait.until (ExpectedConditions.presenceOfElementLocated (By.id (id)));

        WebElement we = driver.findElement (By.id (id));

        WebDriverWait wait2 = new WebDriverWait (driver, delay);
        wait2.until (ExpectedConditions.visibilityOf (we));

        we.sendKeys (Integer.toString (qty));
        result = true;
    }
    catch (Exception e)
    {
        System.out.println ("Exception : " + e.getMessage ());
    }
    return result;
}

производит что-то вроде:

|.enterQuantity : we = [[PhantomJSDriver: phantomjs on XP (b2ff4fa0-7e9a-11e8-bbd0-d99690573e94)] -> id: quantity]
|.waitUntilVisible : we = [[PhantomJSDriver: phantomjs on XP (b2ff4fa0-7e9a-11e8-bbd0-d99690573e94)] -> id: quantity]
|.waitUntilVisible : Exception : Expected condition failed: waiting for visibility of [[PhantomJSDriver: phantomjs on XP (b2ff4fa0-7e9a-11e8-bbd0-d99690573e94)] -> id: quantity] (tried for 25 second(s) with 500 MILLISECONDS interval)
Build info: version: '3.5.0', revision: '8def36e068', time: '2017-08-10T23:00:22.093Z'
System info: host: 'XYZ', ip: '192.168.0.123', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_144'
Driver info: org.openqa.selenium.phantomjs.PhantomJSDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, handlesAlerts=false, databaseEnabled=false, version=2.1.1, platform=XP, browserConnectionEnabled=false, proxy=Proxy(direct), nativeEvents=true, acceptSslCerts=false, driverVersion=1.2.0, locationContextEnabled=false, webStorageEnabled=false, browserName=phantomjs, takesScreenshot=true, driverName=ghostdriver, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: b2ff4fa0-7e9a-11e8-bbd0-d99690573e94
| NB we.sendKeys () executed at this point
|.enterQuantity : Exception web element "quantity" not visible

Первое наблюдение состоит в том, что любое прерывание, генерируемое ожиданием видимости WebElement, не достигает оператора catch (Exception e) в коде.

Этот код работает безупречно, используя Internet Explorer driver; но приложение требует безголового водителя.

Есть идеи?


Обновление:

Реализация решения @ cruisepandey здесь - трассировка стека ошибок:

От phantomjsdriver.log:

[ERROR - 2018-07-03T11:28:18.791Z] Session [68a4d9c0-7eb3-11e8-8639-3bb49fd74d3e] - page.onError - msg: Error fetching the availability or geometry data 
[ERROR - 2018-07-03T11:28:18.791Z] Session [68a4d9c0-7eb3-11e8-8639-3bb49fd74d3e] - page.onError - stack: (anonymous function) ([web page address redacted]) 
[ERROR - 2018-07-03T11:28:19.075Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1530617299040

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете использовать elementToBeClickable, он проверяет, включен ли элемент и виден:

public boolean enterQuantity (WebDriver driver, String id, int qty)
{
    boolean result = false;
    long delay = 30000;   // should be ample!
    try
    {
    WebDriverWait wait = new WebDriverWait (driver, delay);
    wait.until (ExpectedConditions.elementToBeClickable(By.id (id)));

    WebElement we = driver.findElement (By.id (id));
    we.click(); // click on element before send keys
    we.sendKeys (Integer.toString (qty));
    result = true;
}
catch (Exception e)
{
    System.out.println ("Exception : " + e.getMessage ());
}
return result;
}
0 голосов
/ 03 июля 2018

Вы можете попробовать этот код:

public boolean enterQuantity (WebDriver driver, String id, int qty)
{
    boolean result = false;
    long delay = 30000;   // should be ample!
    try
    {
        WebDriverWait wait = new WebDriverWait (driver, delay);
        WebElement  we = wait.until (ExpectedConditions.presenceOfElementLocated (By.id(id)));

        wait.until(ExpectedConditions.visibilityOf(we));
        we.sendKeys(Integer.toString(qty));
        result = true;
    }
    catch (Exception e)
    {
        System.out.println ("Exception : " + e.getMessage ());
    }
    return result;
}
...