2012-08-09 66 views
0

Unicorn HTTP服務器的一個實例在我的服務器上運行。 它加載在這個目錄下的一些文件:是Unicorn還是Selenium問題?

~/apps/myapp/current/ 

此路徑的符號鏈接的最後一個版本在這個路徑:

~/apps/myapp/releases/234234532/ 

這是由Capistrano的部署時配置。 爲了確保Unicorn重新啓動,我也手動執行,即使我的deploy.rb包含在最後調用的deploy:restart任務,因爲我讀到Capistrano對Unicorn會有一些問題。

我的應用程序即將通過Selenium WebDriver啓動一個Selenium實例。 但是,這是我的問題,硒似乎指向一箇舊版本。

爲了確定,我選擇刪除我的進程中的重要文件,以查看我的應用是否仍然正常啓動,這是我期望的非常好的發佈。 希望我的應用程序沒有啓動,並且出現了一些邏輯錯誤。

所以現在我確定我指的是好的版本,我不明白硒的行爲。我解釋:

日誌中出現的錯誤是:

invalid page structure: Unable to locate element: {"method":"id","selector":"sectionSearch"} 
Command duration or timeout: 1.02 seconds 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 
Build info: version: '2.21.0', revision: '16552', time: '2012-04-11 19:08:38' 
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '3.2.13-grsec-xxxx-grs-ipv6-64', java.version: '1.7.0_147-icedtea' 
Driver info: driver.version: EventFiringWebDriver (org.openqa.selenium.NoSuchElementException) 

綜上所述,硒抱怨和id元素:sectionSearch爲在有關HTML頁面丟失。

所以,建議這篇文章:http://seleniumhq.org/docs/04_webdriver_advanced.html,我通知特定HTML元素不存在以前提高了超時:

wait {driver.find_element(:id, 'sectionSearch')} 

有關信息,等待是一個自定義的方法:

def wait(timeout = 50, &block) 
    Selenium::WebDriver::Wait.new(timeout: timeout).until(&block) 
end 

在本地計算機(開發環境)中,這可能是因爲我使用另一個SeleniumDriver:FirefoxDriver

def driver 
    @driver ||= begin 
     if Rails.env.production? 
     driver = Selenium::WebDriver.for :remote, url: 'http://localhost:4444/wd/hub' 
     else 
     driver = Selenium::WebDriver.for :firefox 
     end 
     driver.manage.timeouts.implicit_wait = 20 
     driver 
    end 
    end 

但還是之後同樣的問題與我的服務器甚至殺害並重新啓動麒麟:

invalid page structure: Unable to locate element: {"method":"id","selector":"sectionSearch"} 
    Command duration or timeout: 1.02 seconds 

所以,我的最後一個動作是服務器的應用程序當前文件夾中手動更改行:

wait {driver.find_element(:id, 'sectionSearch')} 

通過

wait {driver.find_element(:id, 'sectionSearchhhhhhhh')} 

現在我的期望是看到硒抱怨這個缺少的元素,因此誤差將是合乎邏輯。爲什麼要這樣做?因爲我想確保Selenium採用UPDTATED源文件。

而且似乎並非如此,因爲...出現與上一個相同的錯誤。

任何有想法的人?

回答

1

這是一個錯誤的硒和你越來越是否因爲出到達元素或因爲你已經表示了錯誤的選擇之前,你的webdriver的時間(即 - >您收到找不到錯誤元素)。如果我是你,我會用xpath作爲選擇器,因爲它似乎是最可靠的定位器。讓我們以Google的搜索框爲例。您有框下面的HTML代碼:

<input type="text" name="q" value="" id="searchText" maxlength="256"/>

你將使用上面的HTML代碼,形成你的硒元素定位的方式會是這樣..:

driver.find_element(:xpath, "//input[@name='q']")

然而這是不夠的,因爲我在你上面的描述中已經注意到了;你已經嘗試設置隱式等待。達到你想要的效果更好的辦法是這樣的..

!30.times { if (driver.find_element(:xpath, "//input[@name='q']") rescue false) then break else sleep 1; end }

上面的代碼將嘗試30次,每一次嘗試以達到所需的元素(如果失敗的話,你可以捕捉到錯誤之前等待1秒通過使用開始/救援條款本身:

begin 
    .  
    . 
[your code] 
    . 
    . 
!30.times { if (driver.find_element(:xpath, "//input[@name='q']") rescue false) then break else sleep 1; end }  
    . 
    . 
driver.find_element(:xpath, "//input[@name='q']") #so you cause an error that u can capture 
    . 
    . 
rescue  
puts "A time-out error occurred or you have used an invalid element locator" 
    . 
    . 
end 

希望幫助

+0

非常感謝對此的解釋:) – Mik378 2012-08-10 12:53:22

+0

高興的是,我可能是一些幫助:)! – 2012-08-10 13:46:19

相關問題