Вызов метода JavaFX в кнопке с самой большой строкой из списка - PullRequest
0 голосов
/ 05 июля 2018

Я новичок здесь, я новичок в программировании, и я пытаюсь создать приложение 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 с

Может кто-нибудь помочь с этими вопросами?

1 Ответ

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

Вы, кажется, не понимаете, как ListView работает:

A ListView создает ячейки, необходимые для отображения элементов, когда они необходимы. Вы не контролируете себя, когда это сделано. Вы должны иметь возможность иметь дело с созданием клеток, происходящим в любое время. Между ячейками и предметами нет отношения 1: 1. Элементы могут быть переназначены в разные ячейки, и для каждого предмета может быть не одна ячейка.

По этой причине получение информации в cellFactory (что вы делаете в конструкторе ячеек) не будет работать.

Вам следует изменить тип элемента, позволяющий получить доступ ко всей необходимой информации, и использовать свойство ListCell.item в обработчике Button ячейки:

private static class Response {
    private final int responseCode;
    private final String url;

    Response(int responseCode, String url) {
        this.responseCode = responseCode;
        this.url = url;
    }

    // getters...

}

private static class XCell extends ListCell<Response> {
    private final HBox hB = new HBox();
    private final Label label = new Label("Empty");
    private final Button bB = new Button("Show Link");
    private final Text response = new Text();

    public XCell() {
        hB.getChildren().addAll(bB, response, label);
        bB.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent eventTwo) {
                // handle button click using info from cell item
                Response item = getItem();
                WebElement linkTwo = driver.findElement(By.xpath("//a[contains(@href, '" + item.getUrl() + "')]"));
                scrolltoElement(linkTwo);
                HighlightThisLink(driver, linkTwo);
            }
        });
    }

    @Override
    protected void updateItem(Response item, boolean empty) {
        super.updateItem(item, empty);

        // update display
        if (empty || item == null) {
            setGraphic(null);
        } else {
            label.setText(item.getUrl());
            response.setText("("+Integer.toString(item.getResponseCode()) + "):");
            setGraphic(hB);
        }
    }
}
@FXML
private void initialize() {
    listTwo = FXCollections.observableArrayList();
    ListView<Response> lvTwo = new ListView<>(listTwo);
    lvTwo.setCellFactory(lv ->  new XCell());
    paneTwo.getChildren().add(lvTwo);

    listThree = FXCollections.observableArrayList();
    ListView<Response> lvThree = new ListView<>(listThree);
    lvThree.setCellFactory(l -> new XCell());
    paneThree.getChildren().add(lvThree);

    listFour = FXCollections.observableArrayList();
    ListView<Response> lvFour = new ListView<>(listFour);
    lvFour.setCellFactory(l -> new XCell());
    paneFour.getChildren().add(lvFour);

    listFive = FXCollections.observableArrayList();
    ListView<Response> lvFive = new ListView<>(listFive);
    lvFive.setCellFactory(l -> new XCell());
    paneFive.getChildren().add(lvFive);

    ...
}
try {
    huc = (HttpURLConnection)(new URL(url).openConnection());

    huc.setRequestMethod("HEAD");

    huc.connect();

    respCode = huc.getResponseCode();

    switch (respCode / 100) {
        case 2:
            if (respCode <= 226) {
                listTwo.add(new Response(respCode, url));
                System.out.println(respCode+": "+url+" is a success link");
                linkCountTwo++;
                System.out.println("Number of 200s : " + linkCountTwo);
                linkTextTwo.setText("Number of 200s : " + linkCountTwo);
            }
            break;
        case 3:
            if (respCode <= 308) {
                listThree.add(new Response(respCode, url));
                ...
            }
            break;
        case 4:
            listFour.add(new Response(respCode, url));
            ...
            break;
        case 5:
            listFive.add(new Response(respCode, url));
            ...
            break;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...