У меня есть эта страница, которая запрашивает оценки для 16 различных строк, которые генерируются автоматически. Я хочу вставить оценки в каждую строку. Если я запустил код ниже только для 1 строки (т.е. без цикла), он будет работать нормально. Но когда я запускаю его для более чем одной строки, он вообще не работает.
В коде внутри цикла for первый cssSelector предназначен для кнопки. При нажатии на нее запрашиваются баллы по двум тестам, после чего нажимается кнопка «Сохранить».
Я использовал переменную i цикла for с первым cssSelector для изменения строки.
Основной код:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
/**
* @author KARAN
* MYRACECONTROL
*/
public class mrc {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
int max = 100;
int min = 0;
int rndm = 0;
String rdm;
WebElement edit_button;
System.out.flush();
//Create firefoxDriver Object.
System.setProperty("webdriver.gecko.driver", "C:\\eclipse\\geckodriver.exe");
WebDriver driver=new FirefoxDriver();
WebDriverWait w = new WebDriverWait(driver, 10);
// LOGIN
driver.get("http://ec2####-west-2.compute.amazonaws.com/login");
driver.findElement(By.xpath("/html/body/div[3]/div[1]/div[2]/div/form/div[2]/div/input")).sendKeys("[email protected]");
driver.findElement(By.xpath("/html/body/div[3]/div[1]/div[2]/div/form/div[3]/div/input")).sendKeys("admin");
edit_button = w.until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/div[3]/div[1]/div[2]/div/form/button[1]")));
edit_button.click();
// JUDGEPANEL
// Navigate to judge panel
driver.navigate().to("http://ec2####-west-2.compute.amazonaws.com/judgepanel");
// select event
Select drpdwn = new Select(driver.findElement(By.id("selector")));
drpdwn.selectByValue("70");
driver.findElement(By.xpath("/html/body/div[3]/div[2]/div[2]/div[1]/div/div[4]/div[2]/button")).click();
// enter scores
for (int i=1; i<=16; i++) {
//edit_button = w.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#entranceList > div:nth-child("+(i+1)+") > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)")));
//edit_button.click();
driver.findElement(By.cssSelector("#entranceList > div:nth-child("+(i+1)+") > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)")).click();
System.out.println("Button "+ (i+1) +" Pressed");
rndm = (int)(Math.random()*((max-min)+1));
System.out.println(rndm);
rdm = String.valueOf(rndm);
System.out.println(rdm);
driver.findElement(By.xpath("//*[@id=\"modalSlideUp\"]/div/div/div/div[2]/div/div[1]/input")).sendKeys(rdm);
rndm = (int)(Math.random()*((max-min)+1));
System.out.println(rndm);
rdm = String.valueOf(rndm);
System.out.println(rdm);
driver.findElement(By.xpath("//*[@id=\"modalSlideUp\"]/div/div/div/div[2]/div/div[2]/input")).sendKeys(rdm);
driver.findElement(By.xpath("//*[@id=\"modalSlideUp\"]/div/div/div/div[2]/div/div[3]/button")).click();
System.out.println("Save Button "+ (i+1) +" Pressed");
Thread.sleep(10);
}
}
}
Ошибка :
1525848260543 geckodriver INFO geckodriver 0.20.1
1525848260563 geckodriver INFO Listening on 127.0.0.1:4627
1525848261468 mozrunner::runner INFO Running command: "C:\\Program Files\\Firefox Developer Edition\\firefox.exe" "-marionette" "-profile" "C:\\Users\\karan\\AppData\\Local\\Temp\\rust_mozprofile.r5X2ICjOSWCR"
Unable to read VR Path Registry from C:\Users\karan\AppData\Local\openvr\openvrpaths.vrpath
Unable to read VR Path Registry from C:\Users\karan\AppData\Local\openvr\openvrpaths.vrpath
Unable to read VR Path Registry from C:\Users\karan\AppData\Local\openvr\openvrpaths.vrpath
Unable to read VR Path Registry from C:\Users\karan\AppData\Local\openvr\openvrpaths.vrpath
Unable to read VR Path Registry from C:\Users\karan\AppData\Local\openvr\openvrpaths.vrpath
1525848268080 Marionette INFO Listening on port 50000
1525848268827 Marionette WARN TLS certificate errors will be ignored for this session
May 09, 2018 12:14:29 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
JavaScript warning: http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.2/jquery.min.js, line 1: Using //@ to indicate sourceMappingURL pragmas is deprecated. Use //# instead
JavaScript warning: http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.2/jquery.min.js, line 1: Using //@ to indicate sourceMappingURL pragmas is deprecated. Use //# instead
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: #entranceList > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.11.0', revision: 'e59cfb3', time: '2018-03-11T20:33:08.638Z'
System info: host: 'KARAN-VAIO', ip: '192.168.1.8', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '10'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 61.0, javascriptEnabled: true, moz:accessibilityChecks: false, moz:headless: false, moz:processID: 6740, moz:profile: C:\Users\karan\AppData\Loca..., moz:useNonSpecCompliantPointerOrigin: false, moz:webdriverClick: true, pageLoadStrategy: normal, platform: XP, platformName: XP, platformVersion: 10.0, rotatable: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}}
Session ID: 843fa034-f2ad-40ea-a73c-b43a3f9cfebd
*** Element info: {Using=css selector, value=#entranceList > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)}
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
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.RemoteWebDriver.findElement(RemoteWebDriver.java:319)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:413)
at org.openqa.selenium.By$ByCssSelector.findElement(By.java:430)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:311)
at mrc.main(mrc.java:71)
Пример HTML-кода:
<!-- 1st ROW -->
<div ng-if = "!isLocked && !Userlock" class = "row ng-scope" ng-repeat = "entrance in entranceList">
<div class = "col-xs-12 col-sm-12">
<div class = "row">
<div class = "col-xs-12 col-sm-3 ng-binding">
Roma G
</div>
<div class = "col-xs-12 col-sm-3">
<!-- run1 <input type = "number" placeholder = "Run 1 score" ng-model=entrance.run1> -->
run1 <b><span ng-bind = "entrance.run1" class = "ng-binding"></span></b>
</div>
<div class = "col-xs-12 col-sm-3">
<!-- run2 <input type = "number" placeholder = "Run 2 score" ng-model=entrance.run2> -->
run2 <b><span ng-bind = "entrance.run2" class = "ng-binding"></span></b>
</div>
<div class = "col-xs-12 col-sm-3">
<!-- <button class = "button" ng-click=saveEntraceScore(entrance)> Save</button> -->
<button id = "disablerun" class = "btn btn-primary" ng-click = "EditEntraceScore(entrance)"> Edit
<!-- <div ng-if = "isbattleTree === true" class = "">
<i class = "fa fa-lock"></i>
</div> -->
</button>
</div>
</div>
<hr>
<div class = "col-xs-12 col-sm-6">
</div>
</div>
</div>
<!-- 2nd ROW -->
<div ng-if = "!isLocked && !Userlock" class = "row ng-scope" ng-repeat = "entrance in entranceList">
<div class = "col-xs-12 col-sm-12">
<div class = "row">
<div class = "col-xs-12 col-sm-3 ng-binding">
Jenna M
</div>
<div class = "col-xs-12 col-sm-3">
<!-- run1 <input type = "number" placeholder = "Run 1 score" ng-model=entrance.run1> -->
run1 <b><span ng-bind = "entrance.run1" class = "ng-binding"></span></b>
</div>
<div class = "col-xs-12 col-sm-3">
<!-- run2 <input type = "number" placeholder = "Run 2 score" ng-model=entrance.run2> -->
run2 <b><span ng-bind = "entrance.run2" class = "ng-binding"></span></b>
</div>
<div class = "col-xs-12 col-sm-3">
<!-- <button class = "button" ng-click=saveEntraceScore(entrance)> Save</button> -->
<button id = "disablerun" class = "btn btn-primary" ng-click = "EditEntraceScore(entrance)"> Edit
<!-- <div ng-if = "isbattleTree === true" class = "">
<i class = "fa fa-lock"></i>
</div> -->
</button>
</div>
</div>
<hr>
<div class = "col-xs-12 col-sm-6">
</div>
</div>
</div>
И так далее для других строк ..
Есть ли простое решение для этого?
@ demouser123 Да, но нет ничего уникального, ни мета-тегов, ни идентификаторов, ни даже xPaths. Так что я смирись с этим. Причина в том, что все строки создаются автоматически.
Разместите соответствующий HTML-код или, желательно, ссылку на страницу. Исправьте отступ в вашем коде. Трудно читать. Обновите код тем, что вы используете в настоящее время, и обновите (полное) сообщение об ошибке.
@JeffC Извини, брат, но это полностью предназначенный код, который я использую прямо сейчас. И ошибка - это полный вывод консоли. Я не могу разместить здесь HTML или предоставить вам ссылку. Извините за причиненные неудобства.
В комментариях к ответу ниже вы указали, что попробовали обновленный код и получили новое сообщение об ошибке. Обновите код в своем вопросе любым текущим кодом, который вы используете, и опубликуйте полное сообщение об ошибке. Вы можете разместить здесь HTML, и он нам понадобится, если вы хотите, чтобы мы помогли с этим. Нет причин, по которым вы не можете опубликовать хотя бы соответствующий HTML-код.
@JeffC Я обновил свои материалы, как вы и просили. Пожалуйста, изучите это.
@JeffC Вы его еще не видели? Пожалуйста, дайте мне какое-нибудь решение, брат.
Трудно сказать, что вы пытаетесь щелкнуть с помощью размещенных вами локаторов, поскольку у нас нет всего соответствующего HTML. Какую кнопку вы пытаетесь нажать в первую очередь? Кнопка "Изменить"? Затем вы вводите баллы в Run 1 score INPUT, а затем в Run 2 score INPUT и затем нажимаете кнопку Сохранить?
Да Это точный сценарий здесь.




Кажется, вы получаете ошибку из-за того, что ваш селектор недействителен. Внутри селектора вы пишете (i + 1) и ожидаете, что он будет вычислен. Однако все, что находится внутри "", считается буквальной строкой, поэтому с вашей переменной ничего не делается. Вы можете исправить это путем конкатенации строк, например, "div:nth-child(" + (i+1) + ")" (в качестве сокращенного примера). Или вы можете использовать String.format, например. String selector = String.format("div:nth-child(%d)", i+1);
Хорошо, я попробовал ваше предложение. Теперь ошибка обновляется с помощью Element info: {Using=css selector, value=#entranceList > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)}.
Ну, чем кажется, вы двинулись дальше! Было бы неплохо увидеть полную трассировку стека и все относящиеся к делу вещи. (Это все еще InvalidSelectorException или что-то еще?). Вы можете просто обновить материалы, которые вы разместили выше.
Ах, теперь у вас совершенно другая ошибка. Идея переполнения стека состоит в том, чтобы получить конкретные ответы на конкретные вопросы. Это хорошая идея. Во всяком случае, прямо сейчас написано, что ваш элемент не может быть найден. Итак, это вопрос получения правильного css / xpath к желаемому элементу. Если html очень сложен в этом смысле, поскольку нет четких имен классов или идентификаторов, как тестировщик вы можете считать своей обязанностью отстаивать лучший тестируемый код. Я лично считаю, что это часть моей работы «обеспечение понимания качества и рисков для продукта и процесса».
Спасибо за ваше ценное предложение, буду иметь это в виду. Но дело в том, что у нас больше нет контакта с нашим разработчиком HTML. Итак, у вас есть какое-нибудь возможное решение этой проблемы?
Я не знаю, что ты хочешь делать. Вы можете использовать инструменты разработчика из Chrome (или других браузеров), чтобы помочь вам найти правильный CSS. Щелкните правой кнопкой мыши, а затем выберите там и поиграйте, пока не найдете правильный CSS, который даст вам уникальный результат.
Ох, ладно. Я знаю это. Спасибо, в любом случае.
Попробуйте это вместо селектора CSS driver.findElement (By.xpath ("html / body / div [3] / div [2] / div [2] / div [1] / div / div [5] / div [" + i + "] / div / div [1] / div [4] / кнопка ")). click ();
#entranceList > div:nth-child(i+1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(4) > button:nth-child(1)иметь такие локаторы - действительно плохая идея.