2016-04-04 21 views
0

Sadece bununla karşılaşıyorum ve koleksiyonlardan öğelerle uğraşmak biraz zor. Benim durumumda, bir tabloyu ayrıştırmaya ve bir sütunun hücrelerinde bulunan değerleri kontrol etmeye çalışıyorum. OnWatir bir koleksiyondaki öğeleri bulamıyor

def check_cells_values(table, cell_index) 
table.rows.each do |row| 
    row.cells[cell_index].text.should == some_value 
end 
end 

"row.cells [cell_index] .text.should == some_value" testleri bu hata ile başarısız satır: İşte kodudur

Watir::Exception::UnknownObjectException: unable to locate element, using {:element=>#<Selenium::WebDriver::Element:0x7b40a27fd80f640e id="{af57e857-69ed-5345-a4ae-5ab80dff364a}">} 

Bu sadece yeterlidir satırlar boyunca yineleyin ve her satırdaki metni çıktı olarak alın. Bazı satırlardan sonra (rastgele), aynı mesajla başarısız olur.

Justin'in bu sorunu içerdiği bu bağlantıyı (https://jkotests.wordpress.com/unable-to-locate-element/) buldum, ancak öğeleri koleksiyonlarına bağlı bir şey bulamadım.

Güncelleştirme: Burada, ayrıştıracağım bir tablonun bir satır örneği var.

<tr class="dataRow even first" onclick="highlightElem(this)" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}"> 
     <td class="dataCell " id="someid3" colspan="1"><a href="/url">8882</a></td> 
     <td class="dataCell " id="someid2" colspan="1"> 
      <label>Some kind of service</label></td> 
     <td class="dataCell " id="someid6" colspan="1"></td><td class="dataCell " id="someid7" colspan="1"><input class="btn" id="someid8" onclick="A4J.AJAX.Submit('pgToolOffer:pgForm',event,{'similarityGroupingId':'someid8','oncomplete':function(request,event,data){UpdatePopupPosition();},'parameters':{'selectedRatePlan':'Annual','selectedOfferFriendlyName':'Some service 50$','someid8':'someid8','selectedProduct':'Service Descrition','selectedOfferCode':'product\duration\x2DDG275'} });return false;" value="Show Offer Details" type="button"></td> 
    </tr> 
+0

Bu kod için aldığınız istisnanın bu olduğuna emin misiniz? # için "herbiri" tanımlanmamış bir yöntem "- yani [ver_index] .each" hücreleri geçerli olmamalıdır. Belirli bir hücreye sahip olduğunuzda, hücreler [given_index] ', içinden geçecek hiçbir şey yoktur. –

+0

Ben Justin ile anlaşma yapıyorum. ".cells" bir koleksiyon döndürür, ancak '.cells {index]' tek bir hücre olacak, bu yüzden üzerinde yineleme yapacak bir şey yok. Rows.each loop içindeki kod için row.cell (: index => given_index) .text.should == expected_value' gibi bir şey olmasını beklerdim –

+0

Üzgünüm, yanlış kod yazdım biraz geç gördüm . Gerekli düzeltmeleri ekledim. Bir soru olsa da. Row.cell (: index => given_index) .text' ile aynı değil 'row.cells [index]' ('index', koleksiyondaki hücrenin yeridir)? –

cevap

0

İlk Seçeneği (sıkı kodu):

table.rows.each do |row| #We'll take each row 
    cell = row[given_index] #We'll take one cell of the taken row 
    puts cell.text #We'll do some stuff with the text of the cell 
end 

İkinci Seçeneği (en sürekli masa taşınmaya deneyelim):

i = 0 
table.rows.length.times do 
    table = b.table(id: "table") 
    puts table[i][given_index].text 
    i = i+1 
end 
+0

Yazı için teşekkürler. Ama bu yardımcı olmaz. Gövde ile değiştirilse bile kod, "row.text" koyar. Sorunun gövdesini de güncelledim. –

+0

Başka bir yol eklendi. Oldukça kirli bir yol ama belki yardımcı olacaktır. – Antesser

0

Ben müvekkil şüpheli Sayfadaki yan javascript kodu hala masayı oluşturmakta veya otomasyonunuzun onunla etkileştiği noktada güncellemektedir.

Durumun böyle olup olmadığını görmeye çalışmanın bir yolu olarak, davranmaya başlayıp başlamayacağını görmek için bu kodun önüne 10 veya 15 saniye gibi büyük bir bekleme işareti eklemeyi denemeliyim. Normalde uykuyu kullanarak senkronizasyon yapmamayı tercih ederim (çünkü ya çok kısa (flakey testleri) ya da çok uzun (yavaş testler). Fakat sorun giderme ve hata ayıklama için senkronizasyon sorunlarını tanımlamanın hızlı bir yolu olabilir

Eğer bu fark yaratırsa bir senkronizasyon sorununuz olduğunu ve sayfanın kendini ne zaman güncellendiğini nasıl anlayabileceğinizi anlayabileceğinizi biliyorsunuz.Genellikle bu güncellemenin sonuna kadar oluşturulmuş bir elemanın bulunması ve kodunuzun bulunması anlamına geliyor. Devam etmeden önce sayfadaki o öğeyi görene kadar bekleyin.JQuery kullanan sayfalar için jQuery.active değerini (ajax isteklerini aç) da alabilir ve sıfıra gitmesini ve yarım saniye kadar beklemesini bekleyebilirsiniz. sayfanın istemci tarafı ajax istekleri ile yapıldığını ve testin devam etmesi için uygun bir durumda olduğunu söyleme yolu.