簡體   English   中英

可在內部循環運行

[英]Runnable inside for-loop

我想在線程的for循環內運行代碼,因為它幾乎可以執行相同的操作,但適用於不同的頁面(使用Selenium Webdriver)。 我的問題是,我的計數器變量無法增加,因為它必須是最終變量。

這是我的測試代碼,但變量“ tabCount”始終保持為i。

// scrape over all tabs and get data in threads
        for (int i = 0; i < tabs.size(); i++) {
            final int tabCount = i;

            Runnable r = () -> {
                webDriver.switchTo().window(tabs.get(tabCount));
                System.out.println(webDriver.getTitle());
            };

            threadPool.execute(r);
        }

        threadPool.shutdown();
        try {
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

有人可以幫助我在chromedriver的每個標簽頁中並行執行相同的操作嗎?

我認為您走錯了兔子洞。 查看您的代碼:

webDriver.switchTo().window(tabs.get(tabCount));
System.out.println(webDriver.getTitle());

您希望webDriver 切換到另一個窗口。 然后在該選項卡上執行某些操作。 但是,如果第一行和第二行之間存在線程的上下文切換該怎么辦?

如:

  • 線程A:是否執行webDriver.switchTo()
  • 線程B:是否執行webDriver.switchTo()
  • 線程A:打印頁面標題

顯然,這將導致比賽條件! 當然,您可以添加某種類型的鎖定/同步,以便線程始終切換到選項卡並執行其工作,而另一個線程無法同時更新webDriver對象。 但這基本上可以序列化您的測試。

長話短說:該webDriver對象具有內部狀態。 您的方法完全忽略了這一事實,因此無法預測代碼將要執行的操作。

一個簡單的解決方法是按照注釋中的建議在每個線程中實例化一個WebDriver實例。 除此之外,有關如何以不同於硒“思考”並行測試的方式的想法,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM