Yeah, so we're back on the Sportsmax zone and we're talking to Craig Butler of Phoenix All-Stars the founder of Phoenix All-Stars Football Academy here in Jamaica that has produced the likes of Leon Bailey and the most recently Dejeune Whisper Richards And you were Craig just outlining to us just now the hierarchy with regard to this your cell visa club in Belgium And the connection Phoenix All-Star has with it Phoenix All-Stars has 50% of the shares Yes, the club I work for Phoenix Sports Management The owner, the majority chair of Phoenix All-Stars, is Casey Butler And Shelly McFarlane is the co-president of How difficult was it to strike up this partnership because it sounds significant that someone from the Caribbean Could make such an imprint in the Belgian football landscape? Well, it's been years that we've been building our name, building respect A lot of people, they've always said people in your own home Don't respect you as much as people in foreign lands In Phoenix what we've achieved You know people ask for autographs, we cannot walk on the streets in Europe But people ask for autographs It's a lot of respect And sometimes standing to your principles is the most important thing And the opportunity came And we could not refuse that opportunity because it now opens up our ability to play in Belgium Against the Belgian teams And if we perform against them We're actually playing against in the Croquet Cup which is the FA We played against Lommel I'm not just a city player so I play So we're probably not that we could beat them And ironically we drew Genk in the next room Which is my home town So we're playing against KRC Genk with Dimitri Dekande who's our very close friend A lot of it would come later, it would take some time But it came within three months Just imagine if we performed against KRC Genk And even one It would also be like floodgates You used the term just now and you said the opportunity came Could you talk to us a little bit more about how that actually happened Because by just basic English it sounds as if you were given You were afforded an opportunity to do something As opposed to you fighting fighting fighting to get the deal worked on What has happened for years now And we're able to get games against KRC Genk Ajax, Aston Villa, Manchester City, Chelsea The biggest clubs in Europe It meant that we gained a lot of respect Because you don't get that that easily You don't get that that easily And as a result clubs came to us Clubs came to us and said listen We'd like to partner with you To know how you do what you do I remember when the Qatari were trying to get whisper And they didn't They came back to me and said listen How much for your academy We'll buy your academy And money is not an option I said to them Not all things are for sale You know And so we are Because they wanted to find out how I remember the guy saying it But we have not been able to produce What you have produced And you have basically nothing And you are producing world class players So come over to us And I said no So when these clubs in Belgium started to see That we could actually bring great talent Bring great structure and learning Vise has 1500 kids in their academy That is a huge resource center For building And so if we have Relationships with Vise We have relationships in Portugal In Spain, at Ajax At Gank And we are building here We have a European academy Running in Jamaica That's exactly what we are doing So our philosophy is the training Our boys get up at 6 am And I train till 8 Then they go to school They come back after school They train till 6 All that they miss in the morning They do it after school And they come at 3.30 Just like the pros do And we do that 6-7 days a week And you end up developing that mentality With the raw materials that are great Sounds fascinating Craig We are going to go to a break On the Sportsmax zone We will pick up this conversation Stay with us Back on the Sportsmax zone We are speaking with Craig Butler Founder of Phoenix All-Stars Football Academy And of course Phoenix All-Stars Doing great things Getting quality players into Europe As professionals And now part of Involved in a partnership With the URSL Visa And Craig, I understand that There are a number of players From Jamaica That have already been signed To this club in Belgium More top players The graduates Mario Simms We have Saka Clément Wilson Who was at Jamaica College last season Michael Graham He's been with Phoenix since he was 8 Then we have Richie Little Richie from Clarence College Marcus Reed We have Don Hugh Mitchell Who was the second leading gold square In Manicope last year from Central Defense Damoy Whitfield Or Midfielder Zander Bicknell And Shaba Shaman Phillips from St. Vincent And Jade Clark Who has been with us since he was 5 years old, 6 years old So we have A very solid component And the assistant coach Is none other than Former Bridgeport Manicope winner Ricardo Marti Blacks So we're not just Players, we're building coaches And we're giving them the opportunities To learn, develop in Europe And come back And give back to our country Since the Chelsea signing of Dejeon Whisper Richards Has there been Greater interest in Phoenix All-Stars Academy Locally From let's say Players and parents who Want to be part of your organization Has that happened Or has it remained steady Yes a lot of people have wanted To come on board but unfortunately That's not what Phoenix is about We're about building long term Relationships of the 10 players That are now in Europe 8 of them have been with us Since they were pre-teens So we want to Continue to develop them Properly, not just get people Who want to come in for an opportunity Because the worst thing you can have Is send a player over And then they mess up You're only as good As a last player Talking about development It's a Manicope Schoolboy football competition Which is often full swing Your Monahai team Also often A pretty good start A few years ago You have spoken about development But there are many individuals Still waiting for Craig Butler And Monahai to win this competition Is this going to be the year Mr. Butler Well for sure If people don't make an effort To sabotage us Why would you say that Craig? Manicope semifinal last year Why would you say sabotage? Because in Manicope semifinal last year We had a head injury To our central defender With blood spilling from his nose The ref didn't stop the game And JC scored That's how we walked out of the Manicope And you see the player On the ground You see the blood on the player And everybody brushes it under a rug Hopefully This year We will be able to have a fear I'm trying to be a nice guy So that they don't use me To hurt the boys, you know But honestly How difficult is that though Craig? Being a nice guy? If you know me I ball for everything I care a lot about the people I love Hold on Craig You crying does not make You a nice guy No man And he's not talking about a footballer No listen If you want to succeed in life You have to be tough I learned that from Doug LaSalsa Dougie when I used to work for him I said Dougie why everybody hits you You said Craig understand it It's lonely at the top When you get to the top You have to fight to stay there And no one wants you there But in truth and fact Whether you want to admit it or not Whether it's that We're at the top of Jamaican and Caribbean football Phoenix People are lucky to produce One world class player in an academy Lucky We're produced We can go on and on But the fact of it is Is that I love the fact that one has evolved And we keep evolving our system And getting better and better We have young players coming up And we are moving out the older ones Getting them opportunities And the younger ones are coming in And learning so that's why I'm one of the people that say listen Don't be our organist Stay loyal to where you're coming from Don't take away The work that a coach has put into you Just because you want the opportunity With me Be loyal And that's where we're at So disqualified from the Walker Cup Well not 2021 it would have been early 2022 Then in the Manning Cup semifinals Last year Back end of 2022 Last year's team The back end of 2022 team In my opinion Significantly better Than the team that played the previous season In schoolboy football How much better is your team This time around Well as I said to you in the break We have 6 foot 2 6 foot 3 defenders That are able to manage Of all We have lost only 3 players From last year Our goalkeeper has grown And gotten slimmer And is even better now The attacking team With Papa Kishen God Denzel Mackenzie is the best number 10 In the country In any age group Any age group Ayaks already wants him I can take off my phone and show you How much for the number 10 Hit the post 3 times against Ayaks So he's better than every Premier League player in Jamaica Absolutely Every Premier League number 10 Is better than every single one You've seen him Ricardo His legs are huge now He looks like a big man His vision His passing ability with both feet His shooting abilities, free kicks His brain When you have Ayaks Saying to you How much for the number 10 And I said to him listen he was just 16 He won't be 17 till November So you have to wait the whole year And I said boy I could just bring him And send him back until we're ready for him Not just Ayaks Sheffield, Brentford Chelsea He is the next great thing coming out of Phoenix and coming out of Jamaica And I guess we'll get An opportunity this cool boy football season To see exactly What he's made of and exactly what Craig is talking about in terms of the quality I did see him last season Lance I don't recall thinking having seen him Last season that he is the best number 10 In the country but this is a year on And players can improve Significantly over the Course of a year If you think about it Not many Individuals knew about Dejean Richards Until close to the beginning Of last season I think Many individuals started seeing the signs In pre-season And by the time the Manning Cup Has started it was all about Whisper so we look forward To see what Mackenzie has to offer This cool boy football season So essentially Craig If I am to get you correct You are saying you have a team This time around that is Ready to win the Manning Cup Absolutely You know the great thing about this team I remember I was Watching the Wolmans game Couple nights ago I'm obsessive so And I saw we had five Players on the bench Now we have registered 30 players Our bench is so deep We can change our players Because what happened is the little ones Have grown up in the system They have gotten bigger like even Theo You saw a boy last year He is now a man And Sean Layton started At 12 playing Manning Cup He is now 6'3 That's a lot of growth And he is only 15 now So he still has Another four years left Because he is born in September I noticed that you have At least one change To your coaching staff We know that you are the engine Of this Mona setup But I noticed that Your assistant coach from last season Is now an assistant In Jamaica College Actually I was not very happy During the semifinals The game against St George's quarterfinals When I was On a red card in the stands And they asked him How you feel about the game Coming up he says Well I don't really want to play Jamaica College And if you are a part of my team You don't speak that way About my players My players If the coach doesn't believe in the team Then please go to the team That you believe in Because we only want believers here And so I let him go And then he went to JC Wish him all the best But that photocopy is never as good as the original What was his reaction To being let go though Because he has been with the program He has been your trusted soldier I suppose Yes he has been with the program But as I said there were issues That we never had it up front To me loyalty Is everything Everything And loyalty goes both ways I will My boys know I will go to Hell and back for them And so they will give me They will go to Hell and back for me On that pitch I just think I was missing I could bring Dan Peralta Dan is a A former top footballer He loves the game He has a Bested interest because Dante is his son And he has been around us Since Dante was six He is part of the program I have always tried to build As a coach The guy who is my assistant Just in case anything happened to me But then I am sure That Mona And Phoenix are in good hands Yeah Craig like you I am trying to be a good guy I don't like to Be referred to As not so nice And so I almost feel Badly putting you in this position But I probably won't get paid At the end of the month If I don't ask you this question A lot of criticism For top players Leon Bailey In the national set up And definitely out of the Conker Kaif Nations League matches That he doesn't seem to play his best When he is playing For the national team He doesn't seem to produce at the level That many expect him to Well the question I want to ask you Is how deep is your knowledge of football I say I have a pretty good Understanding I want you to answer the question This is not for me to answer I want to hear from you Couple things With Conker Kaif International Bricks You play an average of about 20 days You get off for 30 days Out of the year To train together All the players are coming From different clubs With different systems Which they play for Operating I think Jaime Has done an impeccable job In putting Recruiting And putting great players together The problem is Is that If you don't have a system of development Like all the other clubs Belgium has a system of development They have the youth training From 15 Every weekend Understanding the system That they require to play When they come pros and go to different countries And they are called back to the national team They remember the system that they play When Leon is training 10 months out of the year With Aston Villa He knows exactly where to be When there goes to the line He has the time to actually control the ball Drink a cup of coffee And kick it in the goal Jamaica Has super talented players But Heimer is now trying to put a system In place With 20 days out of the year to train To operate Leon has been asked to play a role That he doesn't play Aston Villa He's been asked to be the leader And the organizer And the fixer on the team If you watch Leon play Explain leader organizer and fixer Because they seem like very general terms Whisper was playing Striker He was having a difficult time Leon was out on the right wing Put him out on the right wing where he's comfortable Go do the work as a striker And show him He's talking to him constantly He's talking to Demerai constantly He brought Demerai to the national team Don't ever forget that He brought him in, it's his friend Leon is a catalyst That's not a familiar position And if you look at how The team plays They play better With Leon in that position But it's not his position So let me ask you this Are you there for saying Give him a time I have a question to ask you How does Leon and Whisper look to you I'm going to give you a show For yourself because you seem to like Asking questions We can Does Whisper and Leon Look good together Here's what I want to know Craig Are you saying That we need to give Leon Bailey More time to produce At the level that The country expects Of the talent that he is Of course, but I also believe That those two games He played well Very well, I don't think He played badly I think he made others look good I was able to dribble With time and score, you know why Two people were following Leon You said something very important just now Praising Heimer Halgrimson The coach for the job he's doing I heard him And I've heard his assistant as well Speak of working on a Philosophy for Jamaican football Pretty much mirroring what you just Mentioned about getting Young players to understand the system That they want to play Are you confident that these Coaches, the current coaching staff Can inculcate that With the help of the JFF Because they're reporting To a football federation That they can get this done And how quickly they may be Because this is a long term project isn't it One of the things that I can tell you Is that he has had John Wall Working with under 20s And brought in eight of my players Including Denzel I heard John Wall talking And he's preparing them He's showing them what he wants He's showing them the system he wants to play So that, think about it Theo in two years time Is 2026 right? And he will be how old? 18 years old He's developing his team And he's making them Understanding what he wants Professionals Playing different systems And asking them with two Three days training To look like a well oil machine So it's not going to work So are you saying Craig that you are getting more Buying now from the national coaching staff Than you had previously Because you're saying John Wall Now has eight of your players Into his under 20s setup And I remember you in the past Complaining that national coaches Are your players into the under 17 And under 20 programs Absolutely, because I disagreed with what you said earlier That Whisper was only on the radar Shortly before Manico No, I said to the general public Okay, because I was screaming Not speaking to those on the inside I was screaming about Whisper For eight months before Saying you should never have left him Under 20 years And all the other national coaches The chairman of the technical committee Was saying he's no good Yeah But the coach Heimer Haagribson knows That he will be judged Based off his results If he gets wins And if he takes us to a world cup The JFF no matter what they want They can't fire him But if he bows And puts in the players that People want Then he will lose anyway So he's having gonads He's going out there He's selecting the best players I remember They had told me Coach came to my house In England That's the type of coach you want Yeah As usual, it's always a pleasure Thank you very much for joining us On the sports mic zone today We stayed with you for the entire show Completely out of time But CPL is coming up The playoffs in another five minutes or so The Jamaican Talos will take on The St. Lucia Kings And it's live on this channel So there is no need to switch It's an eliminator So Lucia goes home Winner continues in the competition Bye bye


Heartbeat is a social network. We will have user comments, chat, direct messages, all the things you expect in a social platform. We are the platform. What we're building is what will allow other people to build on top of Heartbeat. We will have the Heartbeat data API, just like YouTube has its data API. We will have many APIs that you can interface with Heartbeat to build apps on top of Heartbeat. We're gonna have networks. We're gonna have subnetworks. There's many things we're building, guys. And I hope you'll join us on this exciting journey, as you can tell I'm pretty excited, as we create all of this Heartbeat content and features for you.


Hello from my Android phone camera In the last video we were talking about creating animated GIFs or GIFs that we're going to We're going to take some video and create an animated GIF and In the past video I'll show you two websites you can do it to but what if you want to do it right on the phone? There's some advantages to this.  So let's go ahead and do that And that's it. That was two seconds long Sometimes I have to go in to the editor In my video viewer and trim it down a little bit maybe stabilize it, but I don't need to for this video So now I'm going to go into Turmux Turmux is the application I talked about in a previous video that it's a shell environment Check out the previous video about it, but I have FFmpeg installed. I also have The Turmux API installed that allows me to access the storage on my device Which allows me to access my photos. Let me real quick here. Make sure we have the best focus Actually we can zoom in How about that Focus There we go Now I have a command that I have created a little shell script Which I'll try to remember to put a link to in the description of this video and it's just a shell script that Goes into the directory where my photos are stored and my videos are stored creates a list of All the MP4s which I only have two in there right now I think they try to keep my phone clean and gives me a number option. So let me just show it to you so I'm going to go like this and The program the script is called To GIF or to GIF depending on how you say it I hit enter It's going to list out all the MP4s in my directory The newest one is going to be at the bottom in this case. It's going to be number one I'm gonna hit one and hit enter and FFmpeg is going to run When it's done, it's gonna use the Turmux API to open up the animated GIF and There it is now. I just made this a couple days ago. I saw some optimization to do with it But there we go.  I talked about in that video about how Try to focus this in the last video that is I Guess that's good right there. I talked in the last video about how sometimes I want to do a loop That reverses so let's make a video for that I'm just going to step out of the way here Oh, sorry, I messed up. Let's stop that record So in that video clip, I don't move out of the shop. So what I can do now go back into Turmux here Go ahead and clear the screen if I was to type stuff right Yes, Z shell. Thank you. I'm going to zoom in here Okay, now Go ahead and Go up and when you use Turmux you have to There are certain keys you can use to Use the volume keys and keys on the keyboard for example I was hitting volume up and W is to is the up arrow to scroll through your history for example or if you hit One of them I forget if it's up in queue. Yeah up in queue will give you a little arrows and home and end and control alt and tab and escape and You get the volume up in queue again to make that go away Anyway, when you get to our muck's you have to learn that sort of stuff to really make it useful But right here we're going back to the last command which was to jiff or to gif However, you want to say it if I do space R and give it the R argument It will now take a little bit longer But it will generate the animation forward and then I'll animate it reverse and put them together So now I'll do that. I will select that last video now three is the newest video here I'll hit enter and it will go it'll take a little bit longer It's a short little clip so it shouldn't take too long But again the advantage of this is you're doing it right on your phone. You're not uploading to any website so you don't have to worry about Internet speeds or going to someone else's server, but there you go There is our animation. I put my head in and then it reverses it back and Again, as I said in a previous video, it's very important to me to have Clean crisp loops where they're not jerky I mean if they're if they're if there is you know, it doesn't have to be but I just love a good animation that Loops cleanly like this where you can't tell where the beginning and end are so I will post that link I already have posted on pasteman. I'll try to remember put a link to it in the description of this video try to focus here a little bit and So you can get that and I still need to Modify it a little bit. It is making I haven't said it makes it the full resolution, which is 1080p Of of what I record or whatever resolution you record the video at which really isn't necessary for a gift file So I might try to cut that down in size because they are kind of large and But that's it. I just thought I'd share this with you. I hope you enjoy this visit video Please visit films by chris.com. That's Chris of the K. There's a link in the description as always I hope that you have a great day


Hello. Hi there. So I guess everything kind of works, even I'm seeing here in stereo. That's a bit disturbing. Anyway, thank you very much for coming here today. This is our first QA workshop, and we are really excited. We haven't tried this before. So it's going to be two hours, more or less. And what we are going to do is go through the very basic steps of setting up test case scenarios for one feature, a specific feature that is running on. Hello. Hi there. So I guess everything kind of works. So I'm seeing here in stereo. That's a bit disturbing. Anyway, thank you very much for coming here today. This is our first QA. I thought it was a familiar voice, but I couldn't kind of, I didn't link that. Yeah, who's on IRC? OK, well, very good. But anyway, so there's many new people here actually. So we were thinking that it would be good to give you a bit of background, more in general. So how many of you are using Wikipedia? Can you please raise your hands? OK, that's not surprising. But how many of you actually have been editing? Wikipedia articles? OK. And how many of you have a technical profile? Do you work on technical works? And how many of you have done a technical contribution to Wikipedia? Right, so you have seen more or less the differences in hands here. And the context of this workshop is precisely all these efforts we are doing to raise the awareness that you can contribute content to Wikipedia. You can donate to Wikipedia, but also you can do technical contributions to Wikipedia. It is not just a website. It is actually a very complex project that involves, well, a website, which is the fifth most visited internet property, I don't know. So it's not just English Wikipedia, it's just a collection of all the Wikimedia projects. And this is pretty big. If you look at the other organizations in that ranking, they are basically huge corporations with very big teams and very big budgets. And we have none of this. But still, I think we managed to organize many projects and maintain a very good infrastructure quite well. But all this, of course, is done thanks to thousands and thousands of volunteers contributing content, donating. And we are aiming here to increase also the amount of people that contribute their technical skills with development, testing, documentation, and all the other tasks that are usually in software development. So in this context, testing is a very interesting area because you can be the super expert and contribute. And you can be someone without any clue about testing and actually do a very good contribution because that is precisely the users that we need. And then having users and testing specialists working together or under developers, of course, we aim then to increase the quality of our releases and being able to release faster, better quality software. So this is why we are focusing on testing. And within the different areas in testing, we also want to ramp up. It's more than ramp up because we have already started and we have something there. But we really want to make it more popular, the fact of contributing to automated QA browser testing. This is also a task that by the name would just make many people step back, thinking, oh no, this is not for me. But actually, we want to explain to users, editors, people interested in Wikipedia in general, that yes, you can get involved on this precisely because you know the software you're using, you know what to expect. And therefore, you can help us just telling the programs, the computers, to just do all these automated testing and saving us a lot of work. All these, Chris, will explain it a lot better. Is there any question? Do you have any questions like general? What's the Wikimedia Foundation doing? I don't know. Any questions you might have before we get into the specific topic of this session? Would you mind introducing yourself real quick? Yes, that's a good question. Sorry, but I was doing many things. So my name is Kim Jill. I work at the Wikimedia Foundation. I work in the engineering team. But my work is, well, it's a mixture of developer relations and community management. My work specifically is bringing more technical contributors to the project volunteers. It could be individuals, it could be companies, anybody willing to help all these engineering projects that we are developing. Any more questions? I'll give you a bit of information on logistics. So first of all, there's more people. So this is being recorded, or that's the intent, at least, is being streamed live or with a bit of delay as you could hear before. And there's also an IRC channel, Wikimedia Dev. And there's some people out there that are trying to follow this workshop. We haven't tried this before. We don't know how it will work. But in any case, here we are going to work together. But also when it comes to questions or speaking or saying anything, please have a microphone because this will help the people somewhere else today and somewhere else any day because this will be recorded and available. Second thing is, OK, these are instructions for the people here, those that are following online, I guess they know. But there's drinks and food down there. If you're at home, I guess you also know where that is. There's restrooms in this direction. So just follow the corridor, you'll find them. And now we're just in this setup, me talking, and then Chris will talk a bit. But actually, here we are going to be working. So feel comfortable. Just don't steal anything. But apart from that, you can sit in the desks that are more or less available here, here in the coach, whatever you want, OK? I think that's all from my side. I have just one question. Do you know what's wiki love? It's not what you think, or maybe it is, I don't know. Well, it's just a feature that I wouldn't even explain because Chris will get into that, but I will. But it's just a feature that editors or registered editors can just send wiki love to each other. So you're working on something. And then all of a sudden the next morning, you find out that paragraph that you were fighting with, you wanted to reference, do whatever. Someone came and did a great job. So you can just have your breakfast and do something else.  So that's the future we're going to work on. I've made a lot of contributions to Wikipedia to the content, and I created a couple of technical articles as well. But I can't even figure out how to crack the door open as far as programmatic access to Wikipedia or contributing any kind of programs to the software. Yes. Well, there's many ways. And if you don't know, and you've been contributing a lot, it's awful, because you should know by now. And we should have explained it properly. There's a page at media wiki.org called How to Contribute. And that's a start. From there, you can see how to contribute from templates, bots, extensions, many different areas. But it's a white topic, and I think it's better that we can talk about this later. And perhaps we can open a door for you here tonight. Yes, I'm just here. But I really think we should get into the topic. And that's a white one. But for everybody here, media wiki.org, How to Contribute, that's a good start for all the other things that we can do apart from automated browser testing. OK, so Chris, all yours. I will be in charge, trying to be in charge of the audio visuals, and also will be paying attention to IRC just in case there's any questions, comments, anything, OK? Thank you, Kim. My name's Chris McMahon. I'm the QA lead here at the Wikimedia Foundation. I telecommute. I used to live in Colorado. Now I live in Southern California. And I'm not sure where I'm going to live next. But it's probably won't be San Francisco. This is a fairly new project. We started a proof of concept about a little over a year ago. It really got into gear back in the fall. It's had some ups and downs. And we're doing pretty well. I'm pretty pleased with it. And so if you know the topic, we're going to talk about cucumber. And we're going to talk about page objects. I see a lot of people here have laptops. And is there anybody in the audience that wants to walk out of here tonight with running executable browser tests? OK, I see programmers. OK, good. This is excellent. So I left some instructions on our meeting page about installing Ruby and downloading the software from GitHub and that sort of thing. OK, awesome. Everything work for you guys all right so far? Cool. So for those of you who aren't doing that, I'm going to suggest a couple of things. One is that I want to get these people set up real quick. I want to look over their shoulders and see what I can see. And if you want to like Mozi offer and look over their shoulders too, that would be pretty cool too. So let me just see what you have real quick just so I can understand. Oh, OK. Well, when you do, there are instructions. And what we've tried to do is make this pretty easy to install and to get up running on your local machine. We have a shared test environment, which is a default target for these tests. And I also left instructions. Let me go ahead and bring up a wiki page here for us. And another new project for us, not entirely new. But before I joined the foundation a little over a year ago, we didn't have a shared test environment. But it was really viable. We have a shared test environment right now. We can't really see the URL here. But it is called beta labs. And perhaps we could put it in the ether pad. One moment. And even if you're not programming, I would love it if you would just log in to beta labs. And let me make this larger if I can. Log in to, you can see the URL here, I hope, en.wikipedia.beta.wmflabs.org. Sorry about the long URL there. And the reason I'm going to ask you to log in, and if you don't have a user ID to create a user ID, is because I'm going to need your help. Because I know it's really risky. And I know all the pros say don't do this, but we're going to actually write code right here on the screen. And we're going to run it. And it's all going to be executable by the end. And the reason that I want you to log in to beta labs is that this only works if you're a user. You have to be a user to play with a lot of features on Wikipedia's. And in this case, we are in our beta labs environment. And you can't really go too wrong. You can't mess anything up. You can't really think. There's really, this is a sandbox for everybody. But it's a really robust sandbox. It's got a lot of extensions. It's got a lot of interactions.  If you'd like, you can visit me. Or you can visit some other user. Or you can visit your neighbor's user. Or you can visit my user page on beta labs. I'm using CMic Man here. I can't show you this because I can't do this on my own paper. But what I'm going to automate tonight is some tests for wiki love. And this is wiki love. And so if you log into beta labs and you visit somebody else's user page like mine, you'll have a little heart button up here in your tabs on the upper right. If you click the little heart button, you have wiki love. And wiki love is a really remarkable feature in a lot of ways. For one thing, it is a runoff project by one of our developers, Ryan Calderi, as I understand it. It is one of the most popular features we've ever released as well. Every feature we release has a certain amount of controversy. And this one is almost all controversy free. It's very nice. It's a good feature to use for browser testers. I have a list of qualities that make a feature good for browser testing. One of them is that it uses a fair amount of JavaScript. So there's a risk. It's going to look different in an explorer, in a Safari, and in Firefox and Chrome. Some of this JavaScript is not interpreted all the way. The other thing that makes a feature good for user interface testing, for browser testing, is that it requires you to navigate through the application to exercise different states in the application that depend on previous states. Because these are things that are very difficult to tell with a unit test, or an integration test, or an API test. So in this case, we actually have to click buying stars. We actually have to click food and drink. We actually have to click kittens. And it's kittens, you know? Yes. It's on the etherpad, and let me bring that up. You can see log into. Is that readable? I can make the signature. So I have been doing browser test automation for a very, very, very long time. It's something I specialized in, was the very first open-source browser test automation tool. It's called Watter. I was using it in the land, from Watter. And I was around when Selenium was released as well. So I've been doing this for a long time. And a lot of times, people come to me. And this happens to Adam, too. By the way, I introduced Adam Gaccio. He's visiting from Toronto. He's a frequent Selenium contributor, and one man about 10. Anyway, nice to see Adam. So he's a far more expert than me, this kind of thing. But anyway, people come to me, and they come to Adam. And they say, Chris, man, we need to do some test automation. We need to have some browser tests. And my first question is, I was, well, where do you want to test? I've had you want to test it. The answer is, I think we haven't thought very much about that. So that's what we need to do. So the reason that I ask you to log into Wikipedia, or log into the labs, is because I really sort of like to spend a few minutes sort of understanding, what does it mean to use working love? What does it mean to navigate your way through this application? How should this application behave? How do you think this application should behave? Hi, G. Nice to see you. Glad to meet you back. This is often a really difficult thing to say. What should the application do? How should this application behave? When I take action X, what is what happens after that? What should happen after that? This turns out to be really the hardest problem in acceptance test automation and browser test automation and user interface automation is specifying at a very close level the proper behavior.  Because really, truly, deeply understanding a feature and how it affects a user is the most important thing that you need before you can even start automating a test for a thing. You have to sort of understand what it does. Everybody sort of got an eye for Wikilev now, and you can send people some Wikilev. If you visit someone's user page, let me get rid of this so you can see the page around. On the user selenium user here, it's this little red heart up on the right. If you click the little red heart, it will have Wikilev. OK. Yes. This is Richmond. So for testing, I'm on the page on newwikilev.org. So yeah, so if you visit a user page and you click a little heart, you will have Wikilev. And so this actually brings me to my very first technical chunk of the presentation, which is that somebody's got to know what the software is supposed to do. And this is what Cucumber allows us to specify. In the nutshell, this is Cucumber. These are the existing tests that I wrote for beta labs, yes. Yeah. Yeah, we might. So if you click that, is there any? Yeah, you pretty much have to know who you're going to say nice things about. You can check with recent changes or whatever new action you might have with various users is why. People do nice things on Wikilev time. People improve your articles, people send you a message. People do all sorts of things. So as I said, the hardest part is actually, and particularly, specifying in a very close way what the software is supposed to do. And this is what Cucumber gives us. So I've written a very simple test for Wikilev. And it really was going to move. I'm going to ask you guys to help me write the next step. And we're going to walk through what that means to do that. So if you're looking at the feature itself, Cucumber gives us an ability to specify a background. This is the things that happened before each and every test that you had. So in this case, I'm going to, boy, I did. I'm going to visit the user pages so any user to click Wikilev. Every single test that I'm going to do is going to do these steps because they'll all show. Why write them more than once when you don't need to. So I click Born Stores. I'm going to say Born Stores Select Box. You should see a message text field. Born Stores is the simplest option. When I click Food and Drink, this is Food and Drink Select Box. The field's got to contain some baklava for you. If you go through those Store Pathels, there's an old joke around here about Store Pathels. We have a lot of Dutch, and we love their Store Pathels. And in this case, the Food and Drink option should have a message text field we're able to. And of course, when there's kittens, because kittens, you click kittens, you should be able to select an age. So you have a text field containing this text about a kitten, and you should see a message text field. So it's a very little test. It's a very simple test. And you may notice I have not yet actually saved a wiki of gift on the page. I simply decided that for this test, all I want to do is I want to check that the aspects of this feature are in place, and I can manipulate them, and I can address them properly. I haven't saved. I haven't decided if I want to do it. So let's run the test. For those of you who might have this up and ready to go, we are using a feature of Wiki. This is the Wiki one, as I was telling Adam. We're operating it such.  I can't wait to run it, and I'm not going to run it. I'd like to sort of emphasize that Wiki brings itself to a very high level of abstraction. And what we're operating here is at such a high level of abstraction that the aspects of Wiki, the program, and the language itself are almost invisible. As you saw, that planing is preferred. So we use a bundle, which just simply makes sure that our environment is correct, without us having to even think about it too hard. Cucumber is a framework that allows us to tie all of these bits of abstraction together into a test. And I'm actually about to run the wrong test because I was doing some work on this one earlier. So I'm doing the proper test. I was actually doing something else in this environment. So we're going to use a pay-for-for Firefox. And hopefully the dinner grids are going to smile at me. And we'll see Firefox come up. And as I said in the background, we're going to log in, visit the user page, doing a cookie live. This is what my own start takes. I'm going to just check that this exists. I don't try to tap into anything. Not yet. I'll tell you more later. I just wanted to have just a really simple framework that's very understandable, so that I could show you and you can help out. Any questions while we are fascinated by watching the test run so far? Yes, sir. The instance variable log in? That is actually a marker. That's a little out of scope from my talk this evening. We mark tests that require logging with that. You can see the instance variable also have various environment names, like data obviously, if we are here, test to a production, we do some productionality with this. So as you can see, it's a little out of scope, but you can talk to me afterwards. I can tell you more about that. I have three scenarios, three tests, 20 steps, and three tests. So I'd like to go back to my cucumber file. I'm going to ask you, what do you think the next test should be? And you guys are experts at Wickey Lab now, right? You know everything there is to know about Wickey Lab. What do you think we should do next? We could do what? I was thinking actually, we might try, if you look at the options on the Wickey Lab page, I'm going to say, we might do that at the end. I'm just a little trepidatious about actually doing. One thing about shared environments is that things tend to be permanent there. Now, how I'm doing that, we have some very large number of very silly images, because we up there a lot of images for testing. And I'm not sure I'm going to up there a whole ton of barn storage right now. What I was thinking is maybe if you look at the Wickey Lab feature itself, there's four choices you can make. And I don't really have tests for three of them. That's a different question from IRC. It's possible to run the tests slower to be able to follow what's happening? I know you would. Not. We sort of want to run this test as quickly as possible. In the back of my mind, as I recall, there is an option to run tests slowly. I do not know what it is. I'm sorry, if I run it again, though, for you. But anyway, if you're looking at the cucumber file, what I think that we should do, so I think we should get some basic coverage for a fourth option. Because it looks a little suspicious, right? Because those first two options, they all have you just clicking and making a select one. The fourth option is really different than that. The fourth option has a whole different way of working. You actually have to fill things in and be creative and inventive and this sort of thing, right? You see what I mean?  Which, since we have our first three tests, we're actually doing a little thing now. We're doing a cucumber. But I got the fourth option kind of late as me. So I can stop this test. It's going to pass again, right? So what I think we should do is a new scenario. OK, sure. More. More separate? Yes, thank you. OK, I used to be a musician. I'm just used to eating microphones. What I like to point out, we're talking about cucumber. We're talking about page objects, too. And one of the things that cucumber gives us and one of the reasons that we choose cucumber in the first place is that, did I lose my screen cam? That's too bad. One more. One of the reasons that we chose cucumber, as I was saying, does that stop? Well, you are seeing cucumber. Can I'm going to reload this so I can come in back in? One of the reasons that we chose cucumber is that it affords us a very low barrier to entry. So what you so afraid I think it in is, yes? Frank, excuse me, I didn't read you what you're doing. You would say that you know quite a lot about Wikipedia, that you've been working with Wikipedia for a long time, and that you're exactly the kind of person we're looking for. Somebody who knows how the software works, who knows how the software's supposed to work, who can actually give us a file of cucumber scenarios and say, given I do this, when I take some action, then something should occur. This is actually incredibly useful a thing for us. So can I see your screen? But no one doesn't seem to be sure. Selenium, that's a really good question, actually. Selenium is a tool that drives a browser. Cucumber is a framework. I'm sorry. There you go. Now we're back. Selenium, OK, so I'm going to take a technical digression here. There are two versions of Selenium. There's a Selenium version 1.0, which is older. And Selenium 1.0 worked by opening a browser inside of a frame and injecting JavaScript into that frame to manipulate the DOM itself. And browsers would then jump around thanks to JavaScript being injected in a frame. Today, everyone, there is Selenium 2.0. Selenium 2.0 has an engine inside of a web driver. Web driver is like this. It's not approved yet, right? It's like web driver is this course to be approved as a web consortium standard, or W3C standard, as the standard interface for automating browser behavior. And this, of course, requires the browser vendors to agree to the standard. And to this state, the web driver protocol is fully supported in Firefox, Chrome, in the Explorer, Opera. I think that's all. Safari, thank you. The browser API is called WebDriver. The outward-facing implementation of that API is called Selenium. Selenium, the API, again, to my knowledge, is fully supported today in Ruby, Python, C-sharp, and Java. And Facebook only just recently, like a week ago, right? That's SeleniumConf released a PHP interface for it. Period. So not to hijack entirely, hijack somewhat. The face, there are about seven or eight different full PHP implementations of WebDriver. Facebook released one about two years ago and then ignored it for two years and released a new version that's completely backwards incompatible with the previous one two weeks ago. But the new one looks pretty nice, but I haven't played with it yet. So, yeah, WebDriver is a standard. OK, one more technical detail, and then I'll move back to Cucumber. Ruby WebDriver is really very nice for a number of reasons. Is that Yari Bakun, who maintains it, builds the Selenium Ruby interface automatically, constantly, and he does it off the standards. The WebDriver is built automatically off of the W3C standard, and the Outward Facing API is built automatically off of the HTML5 standard. So as these standards mature and evolve, the Ruby client interface matches them automatically as they progress. So this is a very nice feature that Ruby gives us. Cucumber is a way, all Cucumber does is it gives you this. Well, it gives you some other things. Cucumber gives you the ability, say, to specify in a form of given when and then what should happen in the software. Behind these given when and statements, you could have objects. You could have API calls. You could have meeting minutes. It doesn't really matter. Given I turn the handle on a door and I push, when I stick my head in, everyone in the room says it should sell out. I mean, you can use a Cucumber standard to do to implement anything you want. We happen to be putting Selenium Browser testing on the back end of this. So let me show you a thing. I have a new test step here, right? We might click Make Your Own. So I'm going to do a new thing in Cucumber. We don't need to have a test run, right? So I'm not going to run the whole thing. I'm just going to run the very last thing. Cucumber gives you the ability to specify a line. Remember, this is really kind of convenient. So I'm going to run my test from 9.20. So I'm going to run the third feature, and then I'm going to run my new feature. And notice I've had no code run so far, right? No code whatsoever. And let's see. Did I not share my screen property? Come now, people. There we go. This is better. OK, so what did I do incorrectly? What did I want to do? I hope the don't have had a smile on me. Like, I think they might not. There's a little slimmer silver here than I'm used to. But one of the lovely things about cucumbers and one of the lovely things about Selenium and one of the reasons that it's so popular is because you can watch the browser. I mean, I find myself just hypnotized by watching the browser just move all by itself. So I'm going to click kittens. And if I save the correct file, I should have not. One moment. Sorry about that. Here we go. This is what I was after. So you notice without actually writing any code at all, Cucumber has actually given me my next line of code for me to write, for me to use. And as I said, we do this by simply writing a line, given winner then, that is going to be our next test step. And when we run it, we will then get a line of Cucumber executable code. It's pending now, so it doesn't actually do anything. But what we can do with this is that we can add it to our steps file. And we can add it anywhere we like. And we can, as you can see, we express the regular expression above with the code that you wish you had. So let's do that. And so from the examples, you can probably see what we should do next. We should say on. And we're going to want to tell the page that we want to be on, which is the Wiki Loaf page. We're going to say. And here's, at this point, we start moving into the page object part of our world. Page objects are an abstraction of a page. Page objects are what we want to do. We identify an element of a page with some aspect of that element, like an ID value, or a name value, or a class value, or the text that's contained within that element. We have a number of ways to identify the page element that we want. And then once we have those identifiers in place, we can name that element anything that we want. I'm going to refer you, actually, to the documentation for the page object. Ruby Gem, it's on GitHub. It's maintained by a guy named Jeff Morgan, who is known to everyone as cheesy. And the documentation here is really absolutely top notch. I recommend, if you're going to dive into doing the browser test automation in our framework that we have here, I have this page open constantly. This is my reference for everything. And one of the beautiful things that it does is it talks about how you can identify elements. Like you can identify a button, for instance, with ALT, with a class value, with ID, index, name, source, text, value, x path. And then while that's not true in the raw Selenium IDE, using the water API, which is even a higher level API, we can specify multiple identifiers. We can specify the third instance of class x on a page. We can specify very, very closely exactly what element that we want to do. But in the meantime, all we got to do is we got to decide what we're going to call that thing, where you click Make Your Own. Because we got to click Make Your Own, right? So what are we going to call it? We'll just call it Make Your Own. That's what we call it. And you can see from some of the other examples that we have. And if you were to read the documentation for page object, you see that what we're really going to need is to make your own element. And then if you were really excited and you really were hip to reading this documentation, you would know that we would have to tell the page to click our thing. It's getting a little more complicated here, right? It's not playing English anymore. We have to actually think about what we're going to name our thing. We're going to have to think about what page it's on. And we're going to have to think about what it is we're going to do to this thing. And in this case, we're going to click it. And again, I'd like to sort of emphasize that one of the reasons that we chose the framework that we did and the implementation that we did is that the barrier to entry is quite low. If you are not a programmer and you were to submit a cucumber file that simply statements are given when, then, for your favorite feature, that's awesome. If you want to give us a step file that's full of things that don't run, that's great, too. Because look, I can run this. Cucumber has told me my next step that I need. So I don't have to think too hard. I just have to put something in place and then I have to run my step. And as usual, since we have a background step, we're going to bring Firefox up that's going to log in. And once it finishes logging in, we're going to navigate to the user page and click Wiki Love. We're going to click Make Your Own, right? Oh, no, we have a terrible, terrible, terrible red error. But that's OK because we just made up that name. We just made up the name, Make Your Own, right? So we get an error message. It's a very important error message that says, undefined method, make your own element for an object called Wiki Love Page. And remember, in our steps file, we said that we were going to be on the Wiki Love Page. And we're going to have a thing. It's called Make Your Own Element. And we get an error message saying, right up front, what we have to do next. Anybody, what we have to do next? We have to put Make Your Own onto the Wiki Love Page. So in order to do that, I'm just about to get there. The question was how to get the dump. Yes. I'm getting complaints from IRC that they don't hear the questions. I will repeat the question. The question was, how do you get the DOM for this? How do you identify this element? And as I said, we're not there yet. This is our next step. Because right now, as I said, we have told those developers, we've told me, you've told Jelco exactly what needs to be done. We need to click, Make Your Own. And we've given you a step. We've even called, we've given a name to that element. We've told you guys to click it. So now, we need to actually put the element in place. So in order to do this, we can do this several ways. Probably the nicest way is, I take it back. This is the nicest way. If you right click in almost any modern browser, you'll have a thing called Inspect Element. There are a couple of different DOM inspectors. There's Firebug. I don't know, anybody know what else there is? There are Chrome Developer Tools. It's F12, an Internet Explorer, right? OK, yeah. Anyway, there's tons of ways to do this. There's a DOM inspector. You can right click on an element. And what we can see is that this particular element, in this particular case, it's down here. It's a div, has a certain class, has a certain text. And I'm actually, I'm really pretty fun. In fact, if you guys remind me, I should really buy Ryan Caldaria beer. Because as I was automating this application, I found it's really very cleanly written. It's really very well designed. This element doesn't have an ID, which you might want. But it's quite nice. It's quite a straightforward way to identify it. And we'll identify this one the way that we identified all the other ones, which are very similar. We'll say, and this is, and right now we are talking about pure page objects. This is page object syntax. We want to make a div. We're going to say that what we want to do is we have a div. And now, our next argument is our totally made up name for this element. That every time we use this name, we're going to use the same name for it, which we call make your own. That is what we call it, right? Make your own, yes. Make your own. And we know that this div has text. And that text is make your own. So we save the file, and we run our brand new scenario, except I have to edit properly, right? It doesn't work if you put the colon in the wrong place. That live coding thing, right? We were just talking, Adam and I, the guy that maintains the Selenium WebDriver bindings in Ruby does this all the time. He is scary typist.  He can code for an hour in front of 500 people, and he makes no mistakes. It's eerie. And there you saw, it turned orange. We clicked, make your own. Our step worked. Our step actually worked. How about that? Any questions at this point? Is it fairly clear what we've done so far? We have plain English. We run plain English. We get the outline for our next step. We make up some stuff for our next step. We run that. We get our error. We put our element in our page. Bingo, we have a working test. Is there any part of that that's not straightforward, or any thing I can clear up? Any question, really? Now it's been one hour, so it's a good test also to see if you are following. So if you have any questions, now it's a good moment. Anybody actually writing tests along the way? Thank you. I was really hoping people would. What's that? Oh yeah, we haven't checked any of this in yet. We can do that. Oh, go ahead. Tell them what. Actually, can I take the mic? I haven't been writing new tests. I've just been following along with the ones that you're doing. That's fine, but you've been typing them out, right? You've been typing them out. You've been running them as they go? Yeah. Awesome. Thank you. This is, you are like, you are prepared to be part of my team right now. You are totally prepared to be part of my team. We have a mail list. Kim can set you up. Just let us know. Actually, now that I'm standing from this position, I can tell that I don't see many tweeters, et cetera. So people are really working here. So we can do something a little fancier. If we go back to our, I managed to close it. Let's go back to our, we call it a feature file. These steps in our, in our cucumber things. We can take a look and see in the barn star, right? I should, I have a message text field, you know, and the food and drink and kittens, you know, they have some default values, right? And this test is going to check the default value is some baklava for you. The default value is kitten for you. I'd like to point out one sort of nice aspect of cucumber as well because everything inside your step is a regular expression. We can check for header text field containing anything we want to. What this line does is we can call this step. I check for the header text field with any strings that we want. We, every time there's a similar element that has a string, we can just grab that string from the cucumber file. So if you decide tomorrow that, excuse me, that this should say some strobe awful for you. I mean, we can just do this right now. We can just, you know, it doesn't, but we can change this to strobe awful if we can change it to anything else we want. So, and our step files are going to be fine. We don't have to reuse those. There was a question. Hello. Both Maggie and I are getting way more deprecation warnings than you. And I'm on Ruby two and Maggie's on 193. There is a line, are you using RVM? Yes. Okay, there is a line on the meetings page on mediawiki.org where I point out at the bottom. Yeah, try, are you aware of the meetings page there? It says, slash meetings slash 2013, 627. They're at the bottom of the page under run and test. Yeah, that's what I'm testing. Yeah, there's a, you see the, you might have to do the source. You might have to source in your dart.rvm file. Try that and see if that gets rid of your deprecordification warnings. There's another question. Hi, yes. Have a seat in a while. Oh, wait. It looks like you might be seeing the wait until present depreciation warning, which I think has to do with some of the log-in steps. Oh, yeah, it could be. I don't think it's something to worry about. It seems to be working okay. We do have a few deprecation warnings. That could be one of them depending on version of the jam you happy running or the version of Ruby that you happen to be running. We try it, we try to keep things pretty up to date. So, actually, we keep things really up to date. I had a question. I was wondering about, you said about matching messages. When, do you have any support for internationalized that internationalized messages? So, presumably some of these things are actually coming from message files and depend on what the current language is. Yes, actually, we have, Jelka and I complain about this to each other mostly, that in what we would really like to see is a lot of ID values, a lot more ID values for page elements than we do see. We end up having to, like for instance, on the make your own, we have a class that is not unique on that page and we have the text and that is our only identifier for that element. So, we have no ID that we can work with. ID values, in case you didn't know, we're a W3C standard, is there's only one unique ID value per page. Name is not constrained that way, but name is also almost always one unique name per ID per page or per element per page. It is a concern, actually, it's a great concern because as we do, as you may know, we do internationalize our Wikipedia. It's in how many languages now? 100 and 300 and there's hundreds of languages. Our language team is incredibly devoted and incredibly competent and we do internationalize these messages and it is a concern, let me put it like that. And we would like to see more robust identification of elements in quite a few of the Wikipedia web pages that we see. We do have some tricks though. I mean, there's always another way to skin a cat. This is just a super simple demo. But yeah, very good question and it's a really big concern. Any other questions? Okay, well, I think we might try to run another, I think we might try to make another step. We'll be bold, as they say. So I'm thinking that if we click make your own, what do we do next? Given I click Wickey Love, when I click make your own and what should I do next? I'm thinking I need to type, right? Yeah, I don't have anything I can select, right? I just need to type some because that's what this aspect of our feature is all about. And we have to remember a good browser test is something where you have to navigate a path. So in this case, we have to click a thing, then we have to enter some text, then we have to enter some more text. So I think we need a feature that when I click make your own, then I should be able to type into, to type into, what was this called? Header, your own header, what do we wanna call it? Anybody? How about your own header? Is that all right? So one of the reasons we wanna be, we wanna take these lines, these lines in Cucumber, we want to make them as descriptive as they can possibly be. Because when this thing fails and some manager is reading this test failure, this manager does not have time to dig into the steps files, to dig into the page files. This manager wants to see what step failed. So we need to really be, we need to take some care. We need to take some real care with how we describe what it is we do here. So then I should be able to type into your own header. I think that's pretty descriptive. If this goes down, we're gonna know why.  What happens next, anybody remember? When I run a feature file that has a line that's not been implemented? Remember what we're gonna see? We click it. And then sure enough, I get some beautiful yellow text in my particular shell that gives me my very next step. It tells me just exactly what I need to do next. So I need to write myself a step. And we can put these steps anywhere. We do this a lot. We have a convention. We keep our given when thens in alphabetical order. We keep the elements in our pages in alphabetical order because as these get larger, it makes less sense to have them in the order that they are executed. Cause you just wanna find them again. So we keep them in alphabetical order. It does not matter the order that these happen to be in. So if you remember, we're just gonna follow the conventions on the existing test. So we're gonna say on wiki love page. And what do we wanna call this?  Gonna call it your own header. And just to be really safe, let's go check the documentation. We're gonna look up what old cheesy says about text fields and how we manipulate them. So text field. So Jeff tells us that if we type just a name of the element, we're gonna get what's in it. And we don't care about that cause it's blank, right? And but if we type the element equals, we can set that value. That's what we wanna do, right? We wanna be able to set the value because it's empty now. It doesn't do us any good unless we type in that. So we're gonna type in there. We're gonna use this right here. Cause Jeff tells us that just a good guy because it's lots of methods for our objects in our pages. So we're gonna say your own header equals, I think it's a string. I should use single quotes, not double quotes. And so remember, as always, if you get really, we like to do this. We like to, if you ever pair a program with Yelko, my colleague in the QA department who is the author of much of this architecture, this framework is a really expert guy. These particular set of tools. And if you ever pair a program with it. Let me just, I know also who is in Croatia now on IRC. So it must be, I don't know, three, four a.m. Yeah, it's about five a.m. in Croatia now, right? Five, 30, something like that. So he's following and active answering questions in IRC. Anyway, as we know, oh, quick make your own. So I made a mistake. I think I have two of these. Yeah, this is wrong. That's not what I should do. I did the wrong thing. Let's just get rid of all this. Actually, let me just do this, because I've lost my mind. You have steps, and what I called this was, I should be able to type into your own header. Sorry, I had to type in. The demo gods have been pretty good to me so far. And the error messages are really nice. The error messages always tell you exactly what went wrong. But as I was saying, if you ever prepare a program with Jelko, he's gonna force you to make your test fail first before you make it pass. It's an excellent practice. And I am often too lazy to do it. Jelko is quite a code reviewer. He's quite a task master. He doesn't let very much get by him. This is awesome. This is exactly the error that I wanted to see. As always, it's telling me that my wiki-love-page object does not have a method for your own header. So let's make that happen. In our page file, if you recall, we will say, and we have to find out what this is because it's a text field, right? I'm pretty sure it is a text field. Oh, and it has ID. This is lovely. See, we always love to see an ID value because we always know we're gonna hit the right element when that happens. So it's a text field and our own special name for it is my own header, as I recall. Is my own header? Oh, your own header. Excuse me, that wouldn't have worked. Your own header. And in this case, we have an ID and the value for that ID is MW wiki-love header. Which is a very lovely thing. As I said, IDs are awesome.  And if I have not made any outrageous typos, you should see my string actually populate. Make sure this is correct here. Lovely, automated test type that right in there. Everything's passed. This is a beautiful thing. I'm gonna stop here for any questions. Real fast. Anybody have a question real quick before I go? I'm getting a capture image when I run my test. I didn't get that earlier when I ran it from outside this location. It's a timing thing. Oh, that's why. That's why. I just told them this was a capture. Yeah, and this is a really great example, too. I'd like to point out browser tests are inherently fragile. You are inherently going to get what they call flaky tests. Any tests, and actually I'll tell you, having to log in at all is kind of a smell. We don't really like to log in with a test because it's kind of a waste of a lot of time and steps. But since we're running these in our shared test environments that are publicly available on the internet, we have to have a login step. And this is absolutely something that happens to me. When I run my suite and my tests do some failed logins and it doesn't work, I have a lot of a bunch of bogus failures because it's craft and cunning mostly. Good design actually eliminates a lot of these sorts of bogus flaky failures. What's that? Therein lies an entirely separate presentation, I'm afraid, my friend. I run the test from a coffee shop three blocks away, but I can't run them in here. That's pretty interesting.  That's my suggestion off the top of my head. I'm gonna do, if there are no immediate questions, I'm gonna do one last special thing. And it's kind of, I'd like to, actually I'd like to thank you all very, very sincerely for helping me write some real tests right here. And I'm gonna check this in right now if you'll be a bear with me. So we use get and make sure my files are good. Yeah, my files are all look really good. So I'm gonna get, just to prove that this is real. We're doing real work here and you guys are helping. Yes, ma'am, do you have a mic? Would you mind just opening each of the files in your text editor to make sure they're out? Yeah, one moment, I'll do this. Because we're a little behind. Let's do this. So I think you have this, yeah well let's do that. I'll do that later. This is more important. So opening these files. We have our feature file. We call this a feature file. The one, the important things about a feature file is that it has at least one string called feature and a name and at least one string called scenario and a name. This is pure cucumber right here. Okay, any questions about a feature file? Okay, steps file. Remember when we run our cucumber feature file with code we haven't implemented, we get that outline, that pending step. This goes into our steps file. On our steps file, this is where the page object starts coming in. We're gonna, that wiki love page are the pages that we're using to test. Our objects in Ruby, they have a name. They include a page object that follows by our own special name for the page element we wanna manipulate, plus whatever we wanna do to that element. That's our step. That's the action that we're gonna take here in our steps file. And then finally on our page file, this is where we specify what the page is. You can see it is the wiki love page. It includes a page object. It has a particular URL. We can use this, reuse this one URL in multiple test environments, including a local environment, including anywhere else. And then each element is specified according to the documentation that Jeff wrote for us here in the page object thing. So as I was saying, we have a very special page, my favorite page in all of Wikipedia. It's a TLDR page. So, okay, excellent. So get... That's all right. Excellent. Test steps. Written writ at WF with volunteers. Get review. So I am going, we have a code review tool here at the foundation. It's called Garrett. Code review is a really, really important aspect of quality at the foundation. All code undergoes code review. It is considered extremely bad form to check in your own code without review. Let me just go somewhere where I'm logged in so I don't have to go with this. As you can see, our tests are here. These are the changes that you and I made. I have a couple of... Jelco is going to have minus one me because I have some blank white space in here that he doesn't like, but that's okay. And I'm going to let Jelco review this. And then I'm going to leave a comment that says, these tests are pretty good. I'll clean up the extra white space later. Soon as this gets merged, our tests are going to be running at least twice a day in the test two, or in the beta labs test environment. That's all I have for you. I want to thank you very much for your help and for your attention. And it's been lovely working with you. So now it's logging me in okay, which is bizarre. Now I suspect that might have been what happened like on Facebook, if I log in in Berkeley and I come to San Francisco downtown, it says that I'm in a strange location and it won't let me log in. So I suspect that maybe that's what your site does if you're at a different IP address. Could be, could be a done out. It's weird, but it's logging in now. Awesome. Any other questions? Non-deterministic. Any other questions, demos? Wait, wait. First, I would like to say thank you Chris for this tour from zero to 100. So please. My pleasure. Very much my pleasure. And I think, I think there's some people here that ask questions. So I think we can, we still have like 20 minutes, a bit more. So I think it would be very good if, yes, we have questions, but maybe we can break a bit this setup and just go a bit more casual. There's also many of the people here that can ask questions, answer questions. So what do you think? Yeah, let's, you know, by all means. Just sounds like we've covered it. Sounds like people are pretty straight and find me or ask Yelko on IRC or talk to Adam or your name, man, in the yellow sweater. Yeah. Maggie knows what she's doing. Thank you all very much. I appreciate it. So now we will do this. Someone on IRC online, we will cut the connection and then we'll still stay here. There's some drinks, oh, there's a question. What can we do to get involved, contribute? Well, yeah, that's a question from, so. Please see mediawiki.org. Take a look at mediawiki.org. Do a search for QA. Yeah. Also the QA mailing list, there should be, is the mailing list on the meeting page yet? I will, well, you all go into questions, answer. I'll just update the wiki page. I'll put a link to the QA mailing list, which is exactly discussing topics like the one today. You can subscribe there, and this is the best gateway to get involved in anything QA, Wikimedia. List.wikimedia.org. You can sign up for the QA mailing list. If you'd like. All right. So, that's that. I will still follow up with the IRC. I will update pages, and here now, for instance, you have questions, so you can ingest. That's a really good question, actually. Can you repeat the question, Tim? The gentleman asked, are we planning to do test-driven development? And the answer is, I certainly hope so. We have not done that yet. And one, there are really two ways that we can go about using tests like this, using Cucumber in particular, and tests like them. It's called acceptance test-driven development, ATDD. And I keep coming back to this. The most important contribution we can have are people that truly deeply understand what the software is supposed to do, how the software is supposed to behave, and how to describe that behavior. So, in the scenario that you're talking about, we write the Cucumber test before we ever write a feature. We say that before we even code a line, here are the conditions that our feature must satisfy. In my experience and anecdotal evidence from my entire career in the last decade, plus a tiny, tiny, tiny fraction of people who do browser tests actually work in this way. Almost everyone uses browser tests as regression tests. And they're incredibly effective at regression tests. So, this is what we do at the foundation. Almost, well, so far 100% of the time is we are taking existing features and we are building coverage for existing features. We are moving hand-in-hand step-by-step with some of the features under development. We have constantly morphing browser tests for our visual editor, for example. We have an intern from the GNOME Foundation outreach program for women who is learning just as you are learning. And her target is the visual editor, a much, much more complex and tricky application than WikiLove. I cringed to try to show you how to automate visual editors. It's a very complex product. And Rachel is spending a significant amount of her time learning how to do this. I would love to do acceptance test development instead of only regression testing. It's not been a super high priority for us as yet, but I would love to see more of it in the future. Great question. Yes, sir. How come so many of the Wikipedia pages don't pass W3C validation? I have not been here long enough to give an experienced answer to that. My theory is that it's a historical accident. Wikipedia itself is only a decade old. The Wikimedia Foundation is, when did the Wikimedia Foundation start, Rob? 2002? Well, 10 years ago, yeah. Yeah, okay. We just had our 10th anniversary. But the foundation at first was like three people, and it was five people. Yeah, yeah.  Yeah, so on the W3C standards front, so what, like we do, I think have reasonably good HTML5 support. Like, so if you're looking for compliance with HTML5 spec, it's like, there are probably our bugs in there, but are there particular validation errors that you're particularly concerned about that many pages have? Yeah, practically every page I try, especially if I'm editing a page and I stick that into the W3C, I get validation errors. In fact, there's a Wikipedia page listing the things that are, that always occur. Yeah. This topic has come up on the Wikitech L list a number of times. I'm not sure if anyone specifically here can answer this question very well, but if you search the Wikitech L archives, you can probably, ah, we have someone here that can't answer this well. Hi, I'm partly responsible for that, I guess. I did not introduce it, but I did vouch to keep it. And that sounds a little weird, like why would you keep an error? So, this is so much controversial, but the way, I'm partially summarizing other people's point, so this is not entirely me, but basically the W3 validator, as you're assuming, you're referring to the validator specifically, is a useful tool to catch issues. It is, however, not a lint tool in the traditional sense for programming because it's not actually what browsers use. It is what browsers should be, ideally, but they aren't. And as such is, it has a lot of things that might be different, but browsers don't actually do. And as such, sometimes the most viable solution to fix a bug is to do something that browsers support in some cases, but the validator might not really validate. That is true, and that's actually one of the reasons that we run our tests in a variety of browsers. As of today, we run these in Firefox, Chrome, IE 10, IE 9, IE 8, IE 7, IE 6. And yes, we do actually identify significant behavior differences in different browsers with exactly the same college page elements. I think the most significant example is, in our lists, we have a UL, and some of the menus, we have an empty list, and the W3 says we shouldn't have an empty list. And this was actually fixed by switching to HTML5 because browsers have always allowed it, and they implemented it in spec. More often than not, it's the spec being outdated and behind what browsers have already done than the browser being behind and spec being forward. It's usually the browser being forward. And if you would check the value of the same page again, and a year from now, it might validate exactly in the same state. Any other questions? A little far field. Kim? I already closed one time the session. I think really, I think we can just leave the mics apart, stop the streaming, and just stay around having more conversations and just questions based on I have this in my laptop, et cetera. Is that the thing? Yes? So I assume yes. Thank you.


What's going on everyone Sam here with late in sports cards doing 21 at 22 Penini select basketball hobby six box half case break number 14 random team style here's a look again at your random results as always you can find these on the website under the results tab as well As well as we're also Sean results down and chat.  I think that would be pretty cool. Is that too much to ask for?  Let's go into the Thunder. There you go Okay, see set out unstoppable kawai behind that and I'm leaked easily Trey young Donovan Mitchell. There's a Kevin Durant game used That's going to the next nice one there Brooklyn Alphan Shengun 64 out of 175 and Lonzo ball. Oh, it's going on out there, but You just have to go mess them up out there at some point Darius Garland Silver Davey on Mitchell Rookie Honestly, I'll just tell you throw it in the recap I guess yeah for colored stuff Jalen Suggs Chris Paul There's Darius Basely going to the Thunder the 249 Oh, so you are an imagine dragons fan. No, I would never listen to an imagine dragons fan. That's all I know Christian Oh Yeah That's Alphan Shengun going to the Rockets Like we got our target audience here carry Irving Silver Kaminga Yolkich Davis nice Scotty Barnes That is going to the Raptors on the rookie Jersey That's true Kyle Isaiah Todd and Corey Kisfer Jalen Green Silver Josh Christopher Chris d'Wartz I I know I know I think exactly Okay, first of all that's nickel back.  It goes. I'll never get in You know most Jaden springer. That's to 249. I never Yeah, they're good man. I know they've got some really good songs If you listen to some of their stuff, dude, it's very good. This might be that's hide-eye Yes, Jaden springer. That is Eight out of 25 on the side I ought to look at this graph There's Anthony Edwards. That was an old vine They sing the song you know, I just see my rookie. So look at this photograph There is somebody on vine like 10 years ago probably They did a meme they're on sharp and Yanis courtside where it was just look at this graph And that was it. It's such stupid, but it was so funny Silver Ben Simmons courtside and Michael Porter jr. Courtside. Oh, there's another mobility on top. They didn't see that Purple use of nerk itch 63 out of 99 blazers and murmur Gold we got a gold Zach Levine day Ron sharp. That's Chris Paul One out of ten on the three colored patch That is nasty congrats sons Wow Game worn on the CP three Ronald are congrats, buddy Lou dork to 299 Dude, I bet the LeBron's because they're game use are gonna be huge the low-numbered ones Very true Jericho Sims, Ricky Ruby. I like the one-of-one LeBron. That's probably big out of this I think so Kelly Ubrea jr. Jeremiah Robinson, I think I'm pulling it right here We did pull an auto out of this Scotty born through and that's gonna be Josh giddy not an auto.  I didn't know how that happened to be honest Bones Island No, Admiral Averly did not help things for Nickelback whatsoever. It's a very good point Nick And I forget there's something what happened on that one Tim. I forget Tray young and D'Angelo Russell Yeah, I Love some 41 You know, it's balance units. They're very good. I love that that's on that lift dude Like a solid I do like like a solid good like I would say month I Played that song my way to work when I was living in upstate, New York when I was working for my like hockey team I'm my way to work I think I played that song every day for like a month of my drive-in that every time I hear that that's exactly what I Reminded of is that commute that exact commute Could get you right to the stadium for where I had right there kid Cunningham Quiet Leonard on the red. It's called trash Chad Kroger Alfred Shengun They're on sharp Jalen Green rookie Lisea Todd got bones Highland. That's going to the Nuggets rookie Jersey not numbered on the silver Chris D'Wartse and the milk Married for three years. That's that's that's what I was gonna say. Yeah Jalen Brown To 249 and Josh giddy. You just want to see the peppers, right? Yeah. Yeah, Shawn went and saw the peppers. Yeah last month, right? Yeah, September Yeah, that's probably my fourth time seeing them Wow, that's awesome. Yeah Kevin love scope Really, that's awesome. That's fantastic and all he did was wrap Kai Jones metal songs, really? Oh, that's that's awesome, that's funny We've got Jalen Rose that's going to the Pacers nice one there Pacers on the Jalen Rose auto to 299 and we've got a lime green Jalen Suggs 27 out of 75 Congrats Orlando Orlando is The team I cannot find oh, Tana K. Congrats. Oh Thank you. You can make this one. Oh, I've been movie rookie This guy this guy to my left here Radio heads really good bones. Yeah, I like radio head my call bridges That is Brandon Boston jr. On the silver and Cameron Thompson Mitchell Robbins I did not Snoop bought a house first dad of my old neighborhood in Georgia. Wow. That's pretty cool actually David Robinson again 24 out of 99 spurs. I'm the lime green auto Grats on that San Antonio That is going to Eric R. Congrats Eric Jalen Suggs and yes Mowgli rookie Hamptons Silver loot or and try young court side box right there that box right there that there box That is Luke canard on the scope Yeah, he was he is a monster dude.  Yeah Scottie Barnes That is Brandon Ingram and Chris Middleton. All right, we are underway ladies and gents There's been four points scored in almost three minutes way to go Jericho Sims. We've got Enos canter and that is Enos freedom. Very cool. There you go Celtics With his name change Enos freedom Sean M. Congrats Sean Isaiah Jackson Ray Tray Murphy that is Jaren Jackson jr. And Nicolae Oakish Anthony Towns on the jersey card. That's going to the T Wolves Not numbered game one Kevin loves silver and you know, it's Valentine's.  I've never said that right Yeah, same honestly this year pretty stoked LeBron James. Wow Jalen Green 93 out of 175 there you go Rockets Congrats Houston team like again cannot find or you'll see You know what I think it's one of the first matches of the World Cup black Friday in 3 p.m. USA England really yep Chris. I'm forcing a six out of 99 on the Jersey Auto X factor Unstoppable y'all Let's have it on up here Yeah, I mean if there's anybody who's gonna be fun to watch the World Cup with it would be for us You know what I mean for sure Silver's higher Williams rookie court side Lonnie Walker Josh Giddy silver Seth Curry and Evan Motley court side rookie nice one there cabs All right box five box five box five Black 101 whoops That's what I would like to see right there Colin Sexton scoop Trit Murphy or Trey Murphy hi-dye coming up guys come on baby big tie-dye That's gonna be nice bones. Highland 25 out of 25 To color patch for the Nuggets There you go Denver on the dress draft selections Jalen Brown Silver LeBron premier level Luka Ant-Man, there's Chris Middleton to 175 Josh Ruprimo Alfred Shen doing blue to 249 Rockets Scotty Barnes rookie Raptors Alex Caruso silver Chris Dwork say court side rookie Jason Tate that's gonna be 20 out of 25 miles Turner three colored patch auto for the Pacers Congrats Indiana game worn on that too man everything all the vets that's game worn in this this year.  Who's your for zebra prediction?  Diamond Moses Moody future appreciate you jumping in man. Thanks Thanks for being a fan. Thanks for the support Silver Kyle Kuzma and Chris stops for things court side Cowboys nice Jalen Tolbert possibilities and then a slew of vets as well You know, they're always gonna hit hard on the bets and that for sure Empty Dearon Sharp, McCall Bridges 2 2 49 sons, Nikhil Alexander Walker Jalen Johnson try color Chris Middleton Luke Garza Cameron Thomas on the draft draft swatches for the Nets Luca silver and Jonas Valenshields Jval Big Jval bones Island Ruthie Trayman Primo blue Dean that is a 50 out of 2 99 blazes And I say a steward on the back piece purple Mitchell Robinson to 99 Nix-Kanard Westbrook silver and we got a kid Cunningham court side non-silver, but still a nice one there Mobley rookie Desmond Bain, we've got Steven Adams 59 out of 99 on the purple X-Factor hatch auto member of when he was a game use as a member of the pelicans nice one there That's Grizzlies John Morant Gris and Trey Murphy Scotty Barnes nice one there. Hey, I appreciate that too man Simon. Yeah, I appreciate that Thank you. Thank you. Scotty Barnes Zion Williamson silver Once it we get to the break and I know what your name is. I'll start calling you by your uh, your first name Kai Jones and Jammerin All right. I coming up here Patrick Williams Trayman 13 out of 25 on the tie-dye rookie auto congrats on that one, uh thunder Nice one there got an in flago for the pelicans. That's uh, Zion Williamson. Jeremiah Robinson That's cool. That's pretty cool. Yeah. No, I appreciate that for sure. Yeah Good looking out. Yeah, absolutely Rudy Gobert And Jonathan Kaminga court side appreciates appreciate the support man No matter what anybody is even if you just flip us on for 10 seconds. We appreciate it, you know All right quick recap here guys That's cam thomas netts, uh bones highland 25 nuggets Jalen green rockets car length any towns timmerwolves bones highland again nuggets josh gimme thunder christ paul gold to 10 going to the uh sons scotty barns raptors kevin durant nets tray man tie-dye to 25 Thunder steven adams to go into the grizzlies chauncey phillips is uh Pistons mild turner pacers chris ops forcing its mads enus freedom going to the uh sultics david robinson Uh spurs jalen rose pacers jaden springer sixers jeremiah robinson roll thunder and we've got a Jalen Suggs lime green Uh 27 out of 75 going to the magic We'll show it one more time there that'll do it for the break guys. Thanks again for the fill next up full case tiered