Я новичок здесь, я новичок в программировании, и я пытаюсь создать приложение Java с Selenium и JavaFX. В этом приложении я смогу проверить ссылки на странице, а также показать указанную ссылку. На данный момент программа может проверить все ссылки на странице, но не может показать правильную ссылку. Я отображаю все URL-адреса в ListView с помощью кнопки, и в этих кнопках вызывается метод для отображения ссылки, но для каждой кнопки в списке всегда отображается один и тот же URL-адрес / ссылка, поскольку это последнее значение, взятое из переменной url
в цикл времени. А также у меня есть 4 вкладки, где я отслеживаю статус HTTP каждой ссылки. Для всех 200 HTTP-статусов они вставляются на вкладке «200 с», для 300 на вкладке «300 с», то же самое для 400 и 500. У меня есть переменная respCode
для статуса HTTP, но она всегда отображает последний значение в цикле while (200). Вот фрагмент кода, чтобы посмотреть на него:
public class AutoTestController
{
// location and resources will be automatically injected by the FXML loader
@FXML
private Button buttonSearch;
@FXML
private Button buttonCheck;
@FXML
private Button buttonAllLinks;
@FXML
private ChoiceBox switchLogin;
@FXML
private TextField testUrl;
@FXML
private TextField stageUrl;
@FXML
private TextField stageIntUrl;
@FXML
private TextField testUrlLiveInt;
@FXML
private TextField testUrlStage;
@FXML
private TextField testUrlStageInt;
@FXML
private TextField customerIdLogin;
@FXML
private TextField customerIdLoginLiveInt;
@FXML
private TextField oneCustomerIdLoginLiveInt;
@FXML
private TextField customerIdLoginStage;
@FXML
private TextField customerIdLoginStageInt;
@FXML
private TextField oneCustomerIdLoginStageInt;
@FXML
private PasswordField passwordLogin;
@FXML
private PasswordField passwordLoginStage;
@FXML
private PasswordField onePasswordLoginLiveInt;
@FXML
private PasswordField onePasswordLoginStageInt;
@FXML
private TextField linkText;
@FXML
private TextField linkTextTwo;
@FXML
private TextField linkTextThree;
@FXML
private TextField linkTextFour;
@FXML
private TextField linkTextFive;
@FXML
private TextField linkTextEmpty;
@FXML
private TextField linkTextAnother;
@FXML
private int textLinks;
@FXML
private ChoiceBox countrySelector;
@FXML
private ChoiceBox countrySelectorLiveInt;
@FXML
private StackPane paneTwo;
@FXML
private StackPane paneThree;
@FXML
private StackPane paneFour;
@FXML
private StackPane paneFive;
private static WebDriver driver = null;
@FXML
private int respCode = 200;
@FXML
private static int linkCount=0;
@FXML
private static int linkCountTwo=0;
@FXML
private static int linkCountThree=0;
@FXML
private static int linkCountFour=0;
@FXML
private static int linkCountFive=0;
@FXML
private static int linkCountEmpty=0;
@FXML
private static int linkCountAnother=0;
@FXML
private String url = "";
private int counter=0;
private ObservableList<String> listTwo;
private ObservableList<String> listThree;
private ObservableList<String> listFour;
private ObservableList<String> listFive;
private List<String> urlsTwo = new ArrayList<>();
private List list = new ArrayList<>();
private List<String[]> urlsTwo2 = new ArrayList<>();
private List<String> urlsThree = new ArrayList<>();
private List<String> urlsFour = new ArrayList<>();
private List<String> urlsFive = new ArrayList<>();
// Add a public no-args constructor
public AutoTestController()
{
}
public class XCell extends ListCell<String> {
HBox hB = new HBox();
Label label = new Label("Empty");
Pane pane = new Pane();
Button bB = new Button("Show Link");
String lastItem = "";
public XCell() {
super();
hB.getChildren().addAll(bB, new Text(" (" + respCode + ") : "), label, pane, new Text(" "));
HBox.setHgrow(paneTwo, Priority.ALWAYS);
bB.setUserData(url);
bB.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent eventTwo) {
Button thisButton = (Button) eventTwo.getSource();
WebElement linkTwo = driver.findElement(By.xpath("//a[contains(@href, '" + thisButton.getUserData() + "')]"));
scrolltoElement(linkTwo);
HighlightThisLink(driver, linkTwo);
}
});
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(null); // No text in label of super class
if (empty) {
lastItem = null;
setGraphic(null);
} else {
lastItem = item;
label.setText(item!=null ? item : "<null>");
setGraphic(hB);
}
}
}
@FXML
private void initialize()
{
countrySelector.getItems().addAll("DE","US","CA","UK","FR","ES","IT","MX");
countrySelector.getSelectionModel().selectFirst();
countrySelectorLiveInt.getItems().addAll("DE","US","CA","UK","FR","ES","IT","MX");
countrySelectorLiveInt.getSelectionModel().selectFirst();
}
@FXML
private void CheckLink(){
String theUrl = "";
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
HttpURLConnection huc = null;
driver.navigate();
List<WebElement> links = driver.findElements(By.tagName("a"));
linkCount = links.size();
System.out.println("Total Links on Page : "+linkCount);
linkText.setText("Total Links on Page : " + linkCount);
Iterator<WebElement> it = links.iterator();
while(it.hasNext()){
url = it.next().getAttribute("href");
if(url == null || url.isEmpty()){
System.out.println("URL is either not configured for anchor tag or it is empty");
linkCountEmpty++;
System.out.println("Number of empty urls : " + linkCountEmpty);
linkTextEmpty.setText("Number of empty urls : " + linkCountEmpty);
continue;
}
if(!url.startsWith(theUrl)){
System.out.println("URL " + url + " belongs to another domain, skipping it.");
linkCountAnother++;
System.out.println("Number of another domain : " + linkCountAnother);
linkTextAnother.setText("Number of other : " + linkCountAnother);
continue;
}
try {
huc = (HttpURLConnection)(new URL(url).openConnection());
huc.setRequestMethod("HEAD");
huc.connect();
respCode = huc.getResponseCode();
if(respCode >= 200 && respCode <= 226) {
urlsTwo.add(url);
listTwo = FXCollections.observableArrayList(urlsTwo);
ListView<String> lvTwo = new ListView<>(listTwo);
lvTwo.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new XCell();
}
});
paneTwo.getChildren().add(lvTwo);
System.out.println(respCode+": "+url+" is a success link");
linkCountTwo++;
System.out.println("Number of 200s : " + linkCountTwo);
linkTextTwo.setText("Number of 200s : " + linkCountTwo);
}
if(respCode >= 300 && respCode <= 308) {
urlsThree.add(url);
listThree = FXCollections.observableArrayList(urlsThree);
ListView<String> lvThree = new ListView<>(listThree);
lvThree.setUserData(respCode);
lvThree.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new XCell();
}
});
paneThree.getChildren().add(lvThree);
System.out.println(respCode+": "+url+" is a redirection link");
linkCountThree++;
System.out.println("Number of 300s : " + linkCountThree);
linkTextThree.setText("Number of 300s : " + linkCountThree);
}
if(respCode >= 400 && respCode <= 499) {
urlsFour.add(url);
listFour = FXCollections.observableArrayList(urlsFour);
ListView<String> lvFour = new ListView<>(listFour);
lvFour.setUserData(respCode);
lvFour.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new XCell();
}
});
paneFour.getChildren().add(lvFour);
System.out.println(respCode+": "+url+" is a client error link");
linkCountFour++;
System.out.println("Number of 400s : " + linkCountFour);
linkTextFour.setText("Number of 400s : " + linkCountFour);
}
if(respCode >= 500 && respCode <= 599) {
urlsFive.add(url);
listFive = FXCollections.observableArrayList(urlsFive);
ListView<String> lvFive = new ListView<>(listFive);
lvFive.setUserData(respCode);
lvFive.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new XCell();
}
});
paneFive.getChildren().add(lvFive);
System.out.println(respCode+": "+url+" is a server error link");
linkCountFive++;
System.out.println("Number of 200s : " + linkCountFive);
linkTextFive.setText("Number of 200s : " + linkCountFive);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void scrolltoElement(WebElement ScrolltoThisElement) {
Coordinates coordinate = ((Locatable) ScrolltoThisElement).getCoordinates();
coordinate.onPage();
coordinate.inViewPort();
}
@FXML
private void HighlightThisLink(WebDriver driver, WebElement element) {
driver.navigate();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].setAttribute('style', 'background: yellow; border: 2px solid red;');", element);
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
System.out.println(e.getMessage());
}
js.executeScript("arguments[0].setAttribute('style','border: solid 2px white')", element);
}
}
Вот захват программы с JavaFX:
Программа проверки ссылок 200 с
Программа проверки ссылок 300 с
Может кто-нибудь помочь с этими вопросами?