2014-02-13 5 views
2

Има пытается щелкнуть все элементы, присутствующие в HtmlКак нажать на ссылку в Selenium WebDriver

http://www.flipkart.com/ Под этой электроники -> Магазин по категориям ->

ниже образец часть Html

<a class="" data-tracking-id="0_Samsung" href="/mobiles/samsung~brand/pr?sid=tyy,4io&amp;otracker=hp_nmenu_sub_electronics_0_Samsung">Samsung</a> 

<a class="" data-tracking-id="0_All Brands" href="/mobiles/pr?sid=tyy,4io&amp;otracker=hp_nmenu_sub_electronics_0_All%20Brands">All Brands</a> 


<a class="" data-tracking-id="0_All Brands" href="/laptops/pr?sid=6bo,b5g&amp;otracker=hp_nmenu_sub_electronics_0_All%20Brands">All Brands</a> 

РМКО щелчок, используя ниже

WebElement ul = driver.findElement(By.id("menu-electronics-tab-0-content")); 
     List<WebElement> lis = ul.findElements(By.tagName("li")); 
     System.out.println(""+lis.size()); 
     String[] linksText = new String[lis.size()]; 
     int index = 0; 
     for(WebElement element : lis){ 

      linksText[index] = element.getText(); 

     String string = linksText[index]; 

     if(string.contains(" ")){ 
      linksText[index]= string.substring(0, string.indexOf(" ")); 
     } 

      index++; 
     }  
       for(index =0; index < linksText.length; index++){ 
      String xpath = "//*[contains(@href,'%s')]"; 
      String y = linksText[index]; 
        String xpathOfElement = String.format(xpath, String.valueOf(y)); 
         System.out.println("Name 1 "+driver.findElement(By.xpath(xpathOfElement)).getText()); 
        driver.manage().timeouts().implicitlyWait(50000, TimeUnit.MILLISECONDS); 

          driver.findElement(By.xpath(xpathOfElement)).click(); 

When iam запускает код, который продолжается до i = 12 до HP после того, как это , указав ошибку. есть 83 Элементы. мне нужно нажать и перейти обратно

Name 1 Mobiles 
Name 1 Bluetooth Headsets 
Name 1 Laptops 
Name 1 Apple 
Name 1 
FAILED: Electronic 
org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with 
Command duration or timeout: 50.20 seconds 
Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15' 
System info: host: 'VALUED-8JGOG5PH', ip: '192.168.1.4', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_45' 
Session ID: 7d9304d9-fe1a-444d-b6b6-4669bfc46a33 
Driver info: org.openqa.selenium.firefox.FirefoxDriver 
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, browserConnectionEnabled=true, webStorageEnabled=true, nativeEvents=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=26.0}] 
    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:193) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554) 
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268) 
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:79) 
    at Examples.FlipkartTest2.Electronic(FlipkartTest2.java:64) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at org.testng.TestRunner.privateRun(TestRunner.java:767) 
    at org.testng.TestRunner.run(TestRunner.java:617) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
    at org.testng.TestNG.run(TestNG.java:1057) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Element is not currently visible and so may not be interacted with 
Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15' 
System info: host: 'VALUED-8JGOG5PH', ip: '192.168.1.4', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_45' 
Driver info: driver.version: unknown 
    at <anonymous class>.fxdriver.preconditions.visible(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:8179) 
    at <anonymous class>.DelayedCommand.prototype.checkPreconditions_(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:10814) 
    at <anonymous class>.DelayedCommand.prototype.executeInternal_/h(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:10831) 
    at <anonymous class>.fxdriver.Timer.prototype.setTimeout/<.notify(file:///C:/Users/ADMINI~1/AppData/Local/Temp/anonymous281959659031274025webdriver-profile/extensions/[email protected]/components/command_processor.js:396) 

есть ли альтернативный способ кроме HREF щелкнуть ссылку.

+0

Вы пытались найти элементы по их 'значения XPath'? – Brian

+0

исправьте меня, если iam неправильное значение xpath будет одинаковым для определенных элементов, таких как «All Brands» – Learner

ответ

2

Вот опциональное решение для Вас:

  1. итерацию все ссылки, и сохранить значения их <href> атрибутов в списке.
  2. Итерировать список, сгенерированный на предыдущем шаге, и перемещать браузер по каждому URL-адресу.

Действовать таким образом будет гарантировать, что ваш код не зависит от WebElement объектов, которые вы читаете из DOM исходного веб-страницы, и как только вы собрали все URL-адреса, вам больше не нужно остаются на этой веб-странице.

Шаг № 1:

Перед переборе lis добавить ArrayList<String> urls = new ArrayList<String>();

Шаг № 2:

Заменить driver.findElement(By.xpath(xpathOfElement)).click();

С urls.add(driver.findElement(By.xpath(xpathOfElement)).getAttribute("href"));

Шаг № 3:

После перебора lis, перейдите к каждому URL:

for (String url : urls) 
    driver.get("http://www.flipkart.com"+url); 
+0

Спасибо, но получив одну ошибку для ссылки org.openqa.selenium.NoSuchElementException: Не удалось найти элемент: {"method": "xpath", "selector": "// * [содержит (@ href, 'Mixer/Juicer/Grinders')]"} Продолжительность или таймаут команды: 50,21 секунды Для документации по этой ошибке, пожалуйста, посетите: http://seleniumhq.org /exceptions/no_such_element.html как его решить? – Learner

+1

Строка 'Mixer/Juicer/Grinders' находится в тексте элемента. В href элемента это строка 'mixer-juicer-grinders'. Поэтому в 'contains (@ href, 'Mixer/Juicer/Grinders')' - либо изменить 'href' на' innerHTML', либо изменить 'Mixer/Juicer/Grinders' на' mixer-juicer-grinders'. –

Смежные вопросы