Hi I am new to Fitnesse framework, and I'm trying to find a way where I can assign a value to a global variable somehow from a database sequence. I already have written few test cases using a variable on page but its value had to be changed manually each time before running test, since I have declared it as,
!define prefix {100}
!|Some Col Fixuture-1
|header1 |header2 |
|Val1 |Val2-${prefix} |
!|Some Col Fixuture-2
|header1 |header2 |
|Val3 |Val4-${prefix} |
Is there any way I can assign value to variable "prefix" dynamically so instead of changing it manually I can just start test and at runtime it may get assigned to it. I tried assigning it in another fixutre before calling any other fixutre but that didn't work, I did something like below,
!define prefix {100}
!|Database Sequence Col Fixuture
|nextVal? |
|$prefix = |
in java I have nextVal method and I'm calling DB to get next value from a sequence and it seems to be working but this new value doesn't get passed to other column fixtures mentioned above, probably due to scope of the variable.
It would be really great help if anyone can suggest or provide any sample to assign value to global variable and using it in multiple fixtures, or if there is any other way to do so.
Any help would be really appreciated, thanks in advance.
Regards,
Harsh
If you are using slim you should be able to use the variable as $prefix.
Please note this is a different variable type, a slim symbol, as compared to the wiki variable you created using !define, you don’t need that define
Related
I am quite new to JMeter and I was trying to increment a counter variable pre-defined in User Defined Variables using a Loop Controller and a JSR223 PostProcessor and it seems not working well. I looked at various examples on JMeter loop and counter examples to work this out but the config element Counter was also not incrementing with the loop.
Could anybody please let me know what I am doing wrong?
This is the user defined variable counter:
This is how I do loop:
And this is how I am trying to increment the counter using post processor and the log displays that the counter is not incrementing for each loop. I want to get the counter upto 5:
[EDIT]
I guess I wasn't clear on why I used ${counter} to test out. I was trying to evaluate the counter variable within another variable as '${__V(transaction_${counter})}' because this needs to be appended to a text file. For example, if transaction_3 has a value "110001", if I do '${__V(transaction_'+vars.get('counter')+')}' to append, the text stored shows "transaction_3" and if I do '${__V(transaction_${counter})}' then I get the correct value "110001" stored in the text file while in next iteration the counter does not increment. Is there a possible way to solve this problem?
This is how I was using the variable within variable and it shows that the values are not changing because the counter is not changing.
And this image is how I am trying to do with vars.get() and it shows that it is just putting the variable name instead of evaluating the value of each item.
According to JSR223 Sampler documentation:
JMeter processes function and variable references before passing the script field to the interpreter, so the references will only be resolved once. Variable and function references in script files will be passed verbatim to the interpreter, which is likely to cause a syntax error. In order to use runtime variables, please use the appropriate props methods, e.g.
props.get("START.HMS");
props.put("PROP1","1234");
So amend the last line of your script to look like:
log.info(vars.get('counter'))
Demo:
Also be aware that it's much easier to use:
Counter test element or __counter() function, check out How to Use a Counter in a JMeter Test article for more details
Loop Controller exposes ${__jm__Loop Controller__idx} JMeter Variable which holds current iteration number
According to the JMeter Manual Best Practices -> 16.12 JSR223 Elements
When using JSR 223 elements, it is advised to check Cache compiled script if the available property to ensure the script compilation is cached if the underlying language supports it. In this case, ensure the script does not use any variable using ${varName} as caching would take only the first value of ${varName}. Instead use: vars.get("varName")`
If you change log.info('${counter}') to log.info('${vars.get("counter")}') that should do the trick!
Or uncheck this:
Is there a Way to get the BuiltInParameterId (Ex:BuiltInParameter.SHEET_SIZE)
from a Parameter ElementId.
I have a number extracted from an Schedule Field (-1010106)
and I want to get the BuildInParameter-id.
Currently I am doing it like this:
BIPdic = {i.value__ : i for i in BuiltInParameter.GetValues(BuiltInParameter)}
bipid= BIPdic[-1010106]
I could not find an easier way. (Its easy, but I have to built a dictionary
from all (over 3000 BuiltInParameters)).
THX
tillbaum
I am not absolutely sure I know what you mean. Check out the description of the ElementId constructor taking a BuiltInParameter input argument.
You can also take a look at the built-in parameter checker BipChecker and its BipChecker GitHub repo. It iterates over all built-in parameter values and tries to retrieve a parameter value for each one.
That sounds pretty similar to what you are after with your dictionary.
browser.find_element_by_xpath('//div[contains(text(), "SomeData")]')
I want to pass a variable instead of a string, I am using Selenuim with python. In this Case A div will be found with text of "SomeData" everytime instead of passing a value as string I want it a variable, which will change everytime I run the code.
I cannot give a correct answer as I am unable to fully understand your question. But lets assume, you want to have some part of your stated xpath as a variable, that part can be stored in a variable and then referenced in your function call.
And my_variable can be controlled in your code and change value as needed without writing complete xpath
Again having said that, more clarity on your question will help the community help you bette
my_variable = 'SomeData'
browser.find_element_by_xpath(f'//div[contains(text(), "{my_variable}")]')
if you are using python version less that 3.6
my_variable = 'SomeData'
browser.find_element_by_xpath(f'//div[contains(text(), "{my_variable}")]'.format(my_variable=my_variable))
or syntax provided in the comment by Andersson
I want to have a matrix/cell, that has strings inside that I can access and use later as strings.
For instance, I have one variable (MyVar) and one cell (site) with names inside:
MyVar=-9999;
site={'New_York'; 'Lisbon'; 'Sydney'};
Then I want to do something like:
SitePosition=strcat(site{1},'_101'}
and then do this
save(sprintf('SitePosition%d',MyVar),);
This doesn't work at all! Is there a way to have strings in a matrix and access them in order to keep working with them if they were a string?
This:
MyVar=-9999; site={'New_York'; 'Lisbon'; 'Sydney'};
SitePosition = strcat(site{1},'_101');
save(sprintf('SitePosition%d',MyVar));
Works fine and yields SitePosition-9999.mat, note the syntax changes in lines 2 and 3.
Is there something else you're expecting?
EDIT: Based on your comment
Check out the documentation for save regarding saving specific variables
New example:
MyVar=-9999;
site={'New_York'; 'Lisbon'; 'Sydney'};
SitePosition = strcat(site{1},'_101');
save(SitePosition,'MyVar');
Creates New_York_101.mat with only the variable MyVar in it.
I am using a simple looping plugin so that my template looks like this:
{exp:loop_plus start="1" end="4" increment="1"}
<h3>{slide_{index}_title}</h3>
{/exp:loop_plus}
However, I am ending up with the following output:
<h3>{slide_1_title}</h3>
<h3>{slide_2_title}</h3>
<h3>{slide_3_title}</h3>
<h3>{slide_4_title}</h3>
Is there any way I can have dynamic variable names like this? I am not looking for alternative methods for building a slider, I simply would like to know if the dynamic variable names like this is possible. Thanks!
I'm assuming that Loop Plus (http://devot-ee.com/add-ons/loop-plus) sets the {index} part, so the question is what is defining {slide_1_title}...?
Assuming you have an entry field or variable with this defined, what you have is correct, but if it's not working, it means there's a parsing order issue.
Let's assume the code you supplied is wrapped in a {exp:channel:entries} tag pair, what happens is EE will try to parse the variable first, so will see: {slide_{index}_title} which doesn't exist. The {exp:loop_plus} add-on will then parse it, converting it to {slide_1_title} (but to late as channel:entries has already tried to parse it), which is what is finally output to the template.
So what you want to ensure is that EE parses {exp:loop_plus} before {exp:channel:entries}, do this using parse="inward" tag:
{exp:loop_plus start="1" end="4" increment="1" parse="inward"}
<h3>{slide_{index}_title}</h3>
{/exp:loop_plus}
This is a global EE parameter that EE uses to control parse order - you won't find it documented under the specific add-on. By adding the parameter, it means this child tag will get parsed before it's parent.
One way you could do it is to declare a preload_replace variable in your template and use it in your custom field name.
So something like:
{preload_replace:my_var_prefix="whatever"}
And then in your loop, you could then use:
{slide_{my_var_prefix}_title}