Nano Hash - криптовалюты, майнинг, программирование

Определение шага Java - Selenium WebDriver находит элемент из результатов поиска

Я новичок в автоматизации Selenium Webdriver с использованием Java и все еще учусь.

В моем классе определения шага RetailTakePayment.java я пытаюсь найти элемент, содержащий конкретный текст, который появляется в результатах поиска (во всплывающем окне), но по какой-то причине мне не удалось найти и щелкнуть его. Я искал вокруг, и мне не очень повезло. Следовательно, размещение моих вопросов для некоторого руководства.

Я надеюсь, что это поможет.

Поиск транспортного средства на странице Salesforce: введите здесь описание изображения

Всплывающее окно — результат поиска: введите здесь описание изображения

Мой HTML: Снимок проверки HTML

Два фрейма в моем HTML: введите здесь описание изображения

Мое определение шага:

@Given("^user complete payment precheck$")
    public void user_complete_payment_precheck() throws Throwable {

        // inserting installer and preferred date
        driver.findElement(By.id("page:frm:main:jobsInfo:jobsRepeat2:0:j_id164")).sendKeys("Test");
        driver.findElement(By.xpath("/html/body/div[1]/div[2]/table/tbody/tr/td[2]/form/div[1]/div/div/div/div[2]/div[5]/div[2]/table/tbody/tr[1]/td/table/tbody/tr/td[4]/span/span")).click();

        // searching and selecting vehicle
        // click on lookup
        driver.findElement(By.xpath("//img[@alt='Vehicle Lookup (New Window)']")).click();
        Thread.sleep(2000);

        // window switch handler    
        String parentWindowHandler = driver.getWindowHandle();
        String subWindowHandler = null;

                Set<String> handles = driver.getWindowHandles();
                Iterator<String> iterator = handles.iterator();
                while (iterator.hasNext()) {
                    subWindowHandler = iterator.next();
                }
                driver.switchTo().window(subWindowHandler);

        // switch by frame
        driver.switchTo().frame(0);

        // searching - this worked!!!
        driver.findElement(By.xpath("//form[@id='theForm']/div/div[2]/input")).sendKeys("autod2018");
        Thread.sleep(1000);
        driver.findElement(By.name("go")).click();
        Thread.sleep(2000);

        // searching for vehicle - STILL NOT WORKING....
        driver.findElement(By.xpath("//div[contains(text(),'BMW-1 SERIES-AUTOd2018')]")).click();      
        // driver.findElement(By.xpath("/html/body/div[1]/div[3]/div/div/div[2]/div/div[2]/table/tbody/tr[2]/th/a")).click();

        // switching back to the parent window - works!
        driver.switchTo().window(parentWindowHandler);

        // save record
        driver.findElement(By.xpath("/html/body/div[1]/div[2]/table/tbody/tr/td[2]/form/div[1]/div/div/div/div[1]/table/tbody/tr/td[2]/input[1]")).click();


    }

Я получаю это сообщение об ошибке:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[contains(text(),'BMW-1 SERIES-AUTOd2018')]"}
  (Session info: chrome=69.0.3497.100)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:32:19.891Z'
System info: host: 'TR-UXB0509', ip: '10.175.139.35', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_151'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.41.578737 (49da6702b16031..., userDataDir: C:\Users\qureshiz\AppData\L...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:57721}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 69.0.3497.100, webStorageEnabled: true}
Session ID: 6282cc65ad89a6e8dd4fe4b996269b19
*** Element info: {Using=xpath, value=//div[contains(text(),'BMW-1 SERIES-AUTOd2018')]}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    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:548)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:322)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:424)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:314)
    at stepDefinitions.RetailTakePayment.user_complete_payment_precheck(RetailTakePayment.java:64)
    at ?.Given user complete payment precheck(C:/Users/qureshiz/ECLIPSE/Workspace/MultipleFeaturesAndSteps/src/test/resources/features/RetailJourney.feature:69)

Другие попытки xpath, но все потерпели неудачу:

//valid xpath-1 - from ranorex selocity - didnt work
driver.findElement(By.xpath("/html//div[@id='Vehicle__c_body']/table[@class='list']//a[@href='#']")).click();

//valid xpath-2 - custom xpath - didn't work
driver.findElement(By.xpath("//*[text()='BMW-1 SERIES-AUTOd2018']")).click();

//valid xpath-3 - from chrome - didn't work
driver.findElement(By.xpath("//*[@id=\"Vehicle__c_body\"]/table/tbody/tr[2]/th/a")).click();

//valid xpath 4 - from firefox - didn't work
driver.findElement(By.xpath("/html/body/div/div[3]/div/div/div[2]/div/div[2]/table/tbody/tr[2]/th/a")).click();
05.10.2018

  • это означает, что xpath неверен. Можете ли вы показать html-проверку элемента, который вы пытаетесь найти? 05.10.2018
  • Ваш XPath неверен, покажите свой HTML, чтобы мы могли легко решить вашу проблему. 05.10.2018
  • Спасибо обоим, я добавил снимок своего HTML. 05.10.2018
  • Вы переключаетесь на фрейм, прежде чем набирать слова для поиска: driver.switchTo().frame(0);, Если таблица результатов поиска не находится в том же фрейме, что и форма поиска, вам нужно переключиться на правильный фрейм, внутри которого находится таблица результатов. 05.10.2018
  • Привет @yong, я переключаюсь первым, потому что ищу слово в дочернем фрейме. 05.10.2018
  • Можете ли вы предоставить html в виде фрагмента кода, а не скриншота? Легче бы разобраться в вашей проблеме. 05.10.2018
  • Привет всем, Извините, я только что заметил, что результаты поиска появляются в другом фрейме (см. вложение). Я пытаюсь переключиться на «resultsFrame» и получаю сообщение об ошибке, что кадр не найден. @anonygoose мой html очень большой, и я не могу добавить его сюда. Отсюда и причина, по которой я сделал скриншот. 05.10.2018

Ответы:


1

Поскольку форма поиска и таблица результатов находятся в разных фреймах, вам нужно переключиться на соответствующий фрейм, прежде чем взаимодействовать с элементом внутри него.

 // switch to search form frame
 driver.switchTo().frame(0);

 // enter search keywords and click go
 ...

 // switch back to topmost frame in the current window.
 // this is very important, you can't directly switch to result table frame
 // from search form frame ( because it's not includes the result table frame).
 // Most of time, we back to the top frame, then jump into other frame.
 driver.switchTo().defaultContent();

 // then switch to result table frame
 driver.switchTo().frame(<index_or_name_of_result_table_frame>);
06.10.2018
  • Привет Йонг, ты был прав. Результаты поиска были в отдельной рамке. Есть два фрейма «searchFrame» и «resultsFrame». Я должен переключиться на driver.switchTo().frame(0); или driver.switchTo().frame("searchFrame");, прежде чем выполнять поиск. Но по какой-то причине я не могу сейчас переключиться на фрейм результатов. Какие-либо предложения? 12.10.2018
  • Это сработало отлично! Хотя я не могу проголосовать. Спасибо, Ён. // сначала переключаемся на кадр поиска driver.switchTo().frame("searchFrame"); // затем переключаемся на самый верхний кадр driver.switchTo().defaultContent(); // наконец переключаемся на кадр результатов driver.switchTo().frame("resultsFrame"); 12.10.2018
  • Если это ваш ожидаемый ответ, пожалуйста, примите его как ответ на вопрос. 12.10.2018

  • 2

    пытаться:

    driver.findElement(By.xpath("//a[contains(text(),'AUTOd2018')]")).click();
    

    текущий код ищет элемент div:

    driver.findElement(By.xpath("//**div**[contains(text(),'BMW-1 SERIES-AUTOd2018')]")).click();
    

    Предоставленный html имеет имя элемента

    <a...>BMW-1 SERIES-AUTOd2018< /a>
    
    05.10.2018
  • Я думаю, что пробовал это раньше, просто сделал это снова, но все еще не могу его найти: org.openqa.selenium.NoSuchElementException: нет такого элемента: невозможно найти элемент: {method:xpath,selector://a[содержит(текст (),'AUTOd2018')]} 05.10.2018
  • Вы тестировали xpath в firebug. Консоль разработчика Chrome запустит следующее: 05.10.2018
  • Нет. К сожалению, в моей тестовой среде firefox v62 firebug несовместим. 05.10.2018
  • попробуй консоль разработчика firefox 05.10.2018
  • У меня не было возможности попробовать их в консоли разработчика Firefox, но тот, который я тестировал, был проверен (я только что добавил их в описание) 05.10.2018
  • Просто заметил, что элемент находится внутри FRAME, Selenium дает вам доступ к содержимому одного кадра в любое время. Два примера фреймов Selenium: заголовок ="шаг определения java selenium webdriver найти элемент, содержащий текст, и щелкнуть"> stackoverflow.com/questions/52664902/ или stackoverflow.com/questions /20069737/ 06.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..