.Quick question - I have the following, working syntax:
<td tal:define="owner record/owner_id; user user/id; mode php:(owner eq user)?'_edit':'_view'; linkname php:(owner eq user)?'Edit':'View';">
${linkname}
</td>
but I was expecting to be able to use the shorter:
<td tal:define="mode php:(record.owner_id eq user.id)?'_edit':'_view';linkname php:(record.owner_id eq user.id)?'Edit':'View';">
${linkname}
</td>
i.e. not having to define owner and user in order to get at them for the php: test.
So my question is, how am I using the dot syntax wrong in the php: context? (also, is there a simpler way to express this WITHIN THE TEMPLATE i.e. without changning the PHP external to the template?
This syntax is fine as long as record and user are objects (instances of classes). If they are arrays, then you need:
tal:define="mode php:(record['owner_id'] eq user['id'])
When you use TALES expressions, PHPTAL figures out object/array difference for you. If you use php:, you have to watch out for differences between objects and arrays.
Related
I have popups with this name structure:
static_dynamic_static
The dynamic part changes each time I log in so my test cases fail each time. I thought about solving the problem with a regular expression like this:
Command: waitForPopUp
Target: regexp:static_.+_static
But this doesn't work. What do I do wrong? Is this even working. If not, is there another way to solve this problem?
From my experience you don't need to declare it as a regex within the target field, you should just be able to have the target as:
static_*_static
and that should do it
If you've got only one popup window you can use null as a target and test will take the first popup:
waitForPopup | null
The other option is to get dynamic part before popup opening. It is very likely that the dynamic part could be retrieved from the page. If so you can get it using storeEval, and than use like:
waitForPopup | javascript{'static'+storedVars['dynamic']+'static'}
If you can't store the dynamic part please provide an html of your page or only the part where the dynamic part mentioned.
I see that theoretically it could be possible to get all the names of your windows and than to use pattern in a loop to get the one.
Also (theoretically) it is possible to expand default waitForPopup function.
But the second way and especially the first are much cheaper.
The best way to handle this might be to run a snippet of javascript to handle this:
<tr>
<td>storeEval</td>
<td>var myRe = new RegExp("^prefix.+", "g"); var mywin; windows=selenium.getAllWindowNames();for (i = 0; i < windows.length; i++) { if(myRe.test(windows[i])) { mywin=windows[i]} }; mywin;</td>
<td>x</td>
</tr>
<tr>
<td>selectWindow</td>
<td>name=${myWindow}</td>
<td></td>
</tr>
That javascript isn't fully function (no null checking) but should help get you on the right track.
I have a page with lots of text using the same class. I am wanting to select and store all the text with that same class. Is this possible? All advice & comments appreciated!
I have HTML code like this:
<p class="foo">Some sample text</p>
<p class="foo">Some more sample text</p>
I have tried this:
<tr>
<td>storeText</td>
<td>//p[#class=foo']</td>
<td>var1</td>
</tr>
I expected var1 to be:
Some sample text
Some more sample text
Alternatively do I need to set up a while statement and gather each individually?
This page talks about a similar exercise, but uses Selenium for Python: Get the text from multiple elements with the same class in Selenium for Python?
//gather all p[class=foo]
List<WebElement> ele = driver.findElements(By.cssSelector("p.foo"));
Iterator<WebElement> iter = ele.iterator();
// initialize array, map, whatever
While(iter.hasNext()) {
// insert text into map
// print to log
// store in array
//whatever you need
var.add( iter.next().text() );
}
I didn't get to try out the answer from #bcar because I am not a javascript expert nor am I sure I could put the answer into IDE. I found another way however. I discovered that the text is stored in tables, so I am using the following code to extract the entire table (which includes the text I need).
<tr>
<td>storeText</td>
<td>//div/h2[text()="Elements and Performance Criteria"]/following::table</td>
<td>Content</td>
</tr>
Now I have to work out how to replace the new lines with as this is plain text. Another question for stackoverflow! Thanks.
Quite easy:
Just loop through the stored elements.
Whenever you use find_elements_by_class_name, it returns the list of selenium web elements. Hence you just need to iterate with a loop, like this.
names = driver.find_elements_by_class_name("_xEcR")
for i in names:
print(i.text)
When attempting to read a mongo _id field from an angular expression:
<tr ng-repeat="person in people">
<td>{{person._id}}</td>
<td>{{person.name}}</td>
<td>{{person.location}}</td>
<td>{{person.active}}</td>
</tr>
the following error is thrown:
"Referencing private fields in Angular expressions is disallowed"
plunker link: http://plnkr.co/edit/dgHNP2rVGPwAltXWklL5
EDIT:
This change has been reverted in Angular 1.2.1: https://github.com/angular/angular.js/commit/4ab16aaaf762e9038803da1f967ac8cb6650727d
The Current Solution
This is due to a breaking change in Angular 1.2.0 ( discussed here: https://github.com/angular/angular.js/commit/3d6a89e )
There's an easy, if not annoying, fix to this.
In your app.run function, you can add a $rootScope level accessors object that contains a function to return the correct Mongo ID.
app.run(function($rootScope) {
$rootScope.accessors = {
getId: function(row) {
return row._id
}
}
});
Then, in your markup, use that method instead of directly accessing the data point:
<tr ng-repeat="person in people">
<td>{{accessors.getId(person)}}</td>
<td>{{person.name}}</td>
<td>{{person.location}}</td>
<td>{{person.active}}</td>
</tr>
A plunker with the fix: http://plnkr.co/edit/NcRrKh
Discussion:
This will allow you to progress forward with your development, but know that it does come with more overhead than if you could just access the variable directly. For small projects, this should not impact performance at any perceptible level, though you might see some measurable amount on larger apps. However, this concern is, as of right now, purely academic.
I have a quick question, I looked around the site and was not able to find another question relevant to what I wanted to ask. I am trying to implement Selenium IDE and use it agiants a company website. I want to be able to record a registration and then have the registration play back. The problem I run into is when the test is played back it always fails. The reason is becase the account cannot be re-created again. Is there a way I can get the test to pass after I have recorded a registration process?
this works for me to create a random email id-
<tr>
<td>storeEval</td>
<td>Math.round (Math.random() * 1357)</td>
<td>random</td>
</tr>
<tr>
<td>type</td>
<td>email</td>
<td>selenium${random}#domain.com</td>
</tr>
To create a random user
<tr>
<td>storeEval</td>
<td>Math.round (Math.random() * 1357)</td>
<td>random</td>
</tr>
<tr>
<td>type</td>
<td>user</td>
<td>selenium${random}</td>
</tr>
The problem is not with your Selenium test, but with the page itself. If you are trying to register the same user again, it is actually expected to fail - you might even record test that validates it.
You have to options - either clean the database so that the test always runs on the same data set or make your script more intelligent. The first option requires you to have full access to tested site (which is usually the case) but you can safely assume that the test results are predictable most of the time.
On the other hand by making the tests more intelligent I meant using random user name (or generating unique name some other way) - more coding and I am not sure whether it is possible with plain Selenium IDE.
You can generate random data while execution of scripts for email/name
Username/ID:- javascript{Math.floor(Math.random()*11)}
--- increased number of digit by increasing number of 1
Email :- javascript{"abc+" + Math.floor(Math.random()*11111) + "#gmail.com";}
Yaasir,
The Selenium IDE gladly executes JavaScript. That means, you may use not only Math.random, but also something that generates more unique identifier.
I am using all the way the timestamp. This is easy and the result is so unique, you would not possibly get same number unless you reset time on your test machine ( in that case possibility of getting same identifier becomes slightly bigger than zero).
Here is the line I use
<tr>
<td>store</td>
<td>javascript{new Date().getTime()}</td>
<td>timestamp</td>
</tr>
As a result, you will get similar to this number 1375400227202
Is there an alternative to using 'Cycle' when creating zebra tables in Zend. ( My version does not have Cycle helper and don't really want to have to upgrade.
Using a partial loop and need each table to put out different bg color. However the partial loop doesn't seem to act as a standard loop with no repeat
I'd use javascript, as long as that's not crutial ;)
$('#table row:even').addClass('even');
I think you're right, the cycle helper seems to reset for every iteration of partialLoop()... which would be consistent with the documentation.
I've gotten round this by using the partial loop's counter, like so:
<tr class="<?php print ($this->partialCounter%2) ? "odd" : "even"; ?>">
<td>Test</td>
<td>Test</td>
<td>Test</td>
</tr>