<?xml version="1.0"?>
<News hasArchived="true" page="8277" pageCount="10825" pageSize="10" timestamp="Sun, 20 Sep 2026 06:50:10 -0400" url="https://my3.my.umbc.edu/posts.xml?mode=activity&amp;page=8277&amp;range=2">
<NewsItem contentIssues="true" id="36977" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36977">
<Title>Alternative Spring Break Trip Participant Applications Open!</Title>
<Tagline>ASB Participant Applications have opened - due Nov. 3rd</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <div><p>Apply to participate here:  <a href="http://goo.gl/8dJ9b5" rel="nofollow external" class="bo">http://goo.gl/8dJ9b5</a></p></div>
    <div>
    <div>Alternative Spring Break (ASB) trips are student-run week long volunteer service trips designed to challenge students and combat civic issues underlying larger societal concerns-- such as homelessness, health care, animal welfare and the environment. Our UMBC ASB trips will teach students the power of service and leave them with a sense of camaraderie, compassion, and empathy for the people of the world, regardless of their race, ethnicity, gender, or socioeconomic status.</div>
    <div><br></div>
    <div>Apply to participate here:  <a href="http://goo.gl/8dJ9b5" rel="nofollow external" class="bo">http://goo.gl/8dJ9b5</a>
    </div>
    <div><br></div>
    <div>Alternative Spring Breaks at UMBC consists of three tiers of service learning. At UMBC we encourage the higher learning of the student via their maturity, critical thinking, and perceptions of society. ASB can be broken down into education, volunteering, and community. All of these components are addressed while attending an ASB trip. Students are immersed into a community that faces a challenge that prevents upward social mobility or survival. Students will be engaged in a week long immersion that strives to actively engage participants in service and reflection.  Each trip is planned and lead by a student trip leader. To insure the safety of the students on the trip a UMBC faculty or staff member is required to participate as a trip advisor.  In depth preparation is included when committing to a trip, which includes service learning related to the population/community you are serving in pre-break service, meetings and team building activities unite you to your trip team, and research into the social justice issue your trip will be addressing.</div>
    </div>
    <div><br></div>
    <div>
    <p>Apply to participate here:  <a href="http://goo.gl/8dJ9b5" rel="nofollow external" class="bo">http://goo.gl/8dJ9b5</a></p>
    <p><span>The ASB trips are still in the planning stages so we don't yet know exactly how many and what type of trips we are offering this year.  However, this application will be used to reserve a spot on one of these trips.  Once we have your application, we will follow up with more information and a chance for you to choose which exact trip you wish to participate in.  </span></p>
    <p><span>Apply to participate here:  </span><a href="http://goo.gl/8dJ9b5" rel="nofollow external" class="bo">http://goo.gl/8dJ9b5</a></p>
    <p>Applications are now open and will be accepted until Nov. 3rd.</p>
    </div>
    </div>
]]>
</Body>
<Summary>Apply to participate here:  http://goo.gl/8dJ9b5    Alternative Spring Break (ASB) trips are student-run week long volunteer service trips designed to challenge students and combat civic issues...</Summary>
<Website>http://goo.gl/8dJ9b5</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36977/guest@my.umbc.edu/284d1fc1a31f65bf4cc20c185c61d2ec/api/pixel</TrackingUrl>
<Group token="retired-271">UMBC Community Engagement Network </Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-271</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/xsmall.png?1498142039</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/original.JPG?1498142039</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/xxlarge.png?1498142039</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/xlarge.png?1498142039</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/large.png?1498142039</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/medium.png?1498142039</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/small.png?1498142039</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/xsmall.png?1498142039</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/271/4ef352d82c0b3506a0df2ed486d44b17/xxsmall.png?1498142039</AvatarUrl>
<Sponsor>UMBC Serves</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/xxlarge.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/xlarge.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/large.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/medium.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/small.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/xsmall.jpg?1381781607</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/977/2096a1e3206c02898f4cb287fbeac1cd/xxsmall.jpg?1381781607</ThumbnailUrl>
<PawCount>2</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 16:18:02 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="123025" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123025">
<Title>Laura Hussey, Political Science, in The London School of Economics American Politics Blog</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>In a recent article published in the <em>London School of Economics American Politics and Policy Blog</em>, Political Science Assistant Professor Laura Hussey argues public antipathy toward undocumented immigrants can play a significant role in shaping social welfare policy among Democrats.</p>
    <p><a href="/wp-content/uploads/2012/10/laura-hussey.jpg" rel="nofollow external" class="bo"><img alt="Laura Hussey" src="/wp-content/uploads/2012/10/laura-hussey.jpg" width="270" height="180" style="max-width: 100%; height: auto;"></a></p>
    <p>The article, “Antipathy toward undocumented immigrants risks fracturing support for social welfare among Democrats”, was jointly written by Hussey and University of Rhode Island Assistant Professor Shanna-Pearson-Merkowitz. It argues Republicans tend to broadly oppose social welfare programs, but Democrats’ support for the same programs can depend more on the specific groups of people they benefit.</p>
    <p>“A key lesson of this research for American Democrats is that forging a consensus on social welfare expansions within their own party may require taking into account public antipathy toward undocumented immigrants,” the article states. “While public projection of anti- (illegal) immigrant sentiment onto social welfare programs may not totally derail expansion, as the health care reform experience also shows, it is likely to constrain policymakers’ options and to result in both delays and drama.”</p>
    <p>You can read the full blog post <a href="http://blogs.lse.ac.uk/usappblog/2013/10/10/undocumented-immigrants-attitudes/" rel="nofollow external" class="bo">here</a>.</p>
    </div>
]]>
</Body>
<Summary>In a recent article published in the London School of Economics American Politics and Policy Blog, Political Science Assistant Professor Laura Hussey argues public antipathy toward undocumented...</Summary>
<Website>https://umbc.edu/stories/laura-hussey-political-science-in-the-london-school-of-economics-american-politics-blog/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123025/guest@my.umbc.edu/ea8a0a8919e74edcbfbabafdf6e95319/api/pixel</TrackingUrl>
<Tag>cahss</Tag>
<Tag>policy-and-society</Tag>
<Tag>politicalscience</Tag>
<Tag>research</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 15:31:53 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="36978" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36978">
<Title>Bits Blog: How to Opt Out of Google&#8217;s Plan to Use Your Name and Comments in Ads</Title>
<Body>
<![CDATA[
    <div class="html-content">Google said it made it easy for users to opt out of its new plan for using their personal information in social ads, but some readers found the opt-out process to be confusing.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F10%2F14%2Fhow-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+How+to+Opt+Out+of+Google%E2%80%99s+Plan+to+Use+Your+Name+and+Comments+in+Ads" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F10%2F14%2Fhow-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+How+to+Opt+Out+of+Google%E2%80%99s+Plan+to+Use+Your+Name+and+Comments+in+Ads" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F10%2F14%2Fhow-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+How+to+Opt+Out+of+Google%E2%80%99s+Plan+to+Use+Your+Name+and+Comments+in+Ads" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F10%2F14%2Fhow-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+How+to+Opt+Out+of+Google%E2%80%99s+Plan+to+Use+Your+Name+and+Comments+in+Ads" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fbits.blogs.nytimes.com%2F2013%2F10%2F14%2Fhow-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads%2F%3Fpartner%3Drss%26emc%3Drss&amp;t=Bits+Blog%3A+How+to+Opt+Out+of+Google%E2%80%99s+Plan+to+Use+Your+Name+and+Comments+in+Ads" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/sc/5/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968208746/u/0/f/640387/c/34625/s/327374aa/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Google said it made it easy for users to opt out of its new plan for using their personal information in social ads, but some readers found the opt-out process to be confusing.      </Summary>
<Website>http://bits.blogs.nytimes.com/2013/10/14/how-to-opt-out-of-googles-plan-to-use-your-name-and-comments-in-ads/?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36978/guest@my.umbc.edu/e1e29c02fd6a2331f7c8db206fe3fb16/api/pixel</TrackingUrl>
<Tag>data</Tag>
<Tag>internet</Tag>
<Tag>new</Tag>
<Tag>privacy</Tag>
<Tag>social</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 15:26:36 -0400</PostedAt>
<EditAt>Tue, 15 Oct 2013 14:08:51 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="36976" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36976">
<Title>Student Entrepreneur Spotlight: Adrian Rosebrock</Title>
<Tagline>UMBC PhD Student launches 3rd company: ID My Pill</Tagline>
<Body>
<![CDATA[
    <div class="html-content">
    <div>Name: Adrian Rosebrock</div>
    <div>Major: Computer Science</div>
    <div>Academic Year: PhD student</div>
    <div><br></div>
    <div><strong>1. Tell us a little about your company, and what makes your business </strong></div>
    <div><strong>unique?</strong></div>
    <div><br></div>
    <div>I am the Founder and CEO of <a href="http://www.idmypill.com" rel="nofollow external" class="bo">ID My Pill</a><span>, an app that identifies your prescription pills in a snap of your smartphone's camera -- instant pill identification.</span>
    </div>
    <div><br></div>
    <div>The goal of ID My Pill is to empower patients by giving them the tools to take a more vested interest in their own healthcare. Physicians prescribe medications, pharmacists fill the prescriptions, but what about patients? They lack the tools to validate their prescription pills -- that's there ID My Pill comes in. ID My Pill gives patients the power to validate their prescription pills in a snap, and at the same time creates a checks-and-balances between the physician, pharmacist, and patient.</div>
    <div><br></div>
    <div>Prescription pill mixups are a very real risk. Over 3.3 million injuries and deaths happen each year due to medication errors. Given that nearly 50% of all prescription pills are round or white, there are a lot of visually similar pills on the market -- it's no wonder that </div>
    <div>medication mixups happen.</div>
    <div><br></div>
    <div>My favorite part of ID My Pill is actually the <a href="http://www.idmypill.com/api/" rel="nofollow external" class="bo">API</a>. Using the API, other companies (such as Drugs.com, Heathline, etc.) can integrate visual pill identification into their own apps, websites, or healthcare solutions. My goal is to make prescription pill identification via a photo the standard in medication identification. </div>
    <div><br></div>
    <div>
    <div><strong>2. Are there classes on campus that have helped you the most?</strong></div>
    <div><br></div>
    <div>Three classes come to mind that helped me the most, all computer science courses. </div>
    <div><br></div>
    <div>The first is Machine Learning which gave me a high level overview of machine learning concepts. The second is Data Mining which explores Machine Learning concepts in more depth. Finally, I remember taking a special topics course, Computational Photography, during the last semester of my senior year. Undoubtedly, it changed the course of entrepreneurial ventures and academic research.</div>
    <div><br></div>
    <div><strong>3. What are some resources that have helped you the most? </strong></div>
    <div><strong>(Magazines, Books, Websites…)</strong></div>
    <div><br></div>
    <div>I'm a big fan of consuming startup podcasts. They keep you in the entrepreneurial mindset and you can listen to them while you're traveling. My favorites include Startups for the Rest of Us, Mixergy, and This Week in Startups.</div>
    <div><br></div>
    <div><strong>4. What is the toughest decision you have had to make in the last 6 </strong></div>
    <div><strong>months?</strong></div>
    <div><br></div>
    <div>My first entrepreneurial venture was ShiftyBits, LLC., a company I setup to do consulting work with the National Cancer Institute (NCI). Working closely with NCI, I helped create methods to automatically quantify the structural properties of acini in the breast. Using this information we were able to create methods to determine breast cancer risk simply from examining breast histology images. Doing this manually (1) requires a pathologist who is heavily trained and (2) is extremely time consuming and tedious.</div>
    <div><br></div>
    <div>Two months ago I was asked to return to NCI and continue my consulting work with them -- this is also about the time when ID My Pill was really starting to turn some heads. While my work with NCI had been rewarding, both emotionally and financially, </div>
    <div><br></div>
    <div>I had to turn the contract down and focus completely on ID My Pill. It was an extremely hard decision. I was passionate about with NCI and I enjoyed it very much -- the timing was just not right and I felt extremely motivated and compelled to push ID My Pill forward.</div>
    <div><br></div>
    <div><strong>5. What advice would you give other student entrepreneurs?</strong></div>
    <div><br></div>
    <div>The first piece of advice is to be a Tylenol, not a vitamin. The product you are developing should solve a particular pain point for your customers. If you have a pounding headache, you don't reach into your medicine cabinet and take a B12 vitamin. </div>
    <div><br></div>
    <div>Instead, you reach for the Tylenol. You want your pain to go away -- keep this same mentality when developing a product for your customers. Is what you are developing a vitamin? Or are you solving an actual problem the customer has? If you are solving an actual pain point, customers are much more likely to pull out their wallets.</div>
    <div><br></div>
    <div>The second piece of advice that I would give is to talk to other people. Talk to other students. Talk to other entrepreneurs. Talk to your parents, your family, your friends. </div>
    <div><br></div>
    <div>And most importantly, talk to your potential customers that your product is targeting. </div>
    <div><br></div>
    <div>Too many times I see entrepreneurs speak to only one or two potential customers about the product they are developing and then disappear into a basement to build the product. Six months later they emerge, triumphant that there product is finished. But then they are disappointed when no one is willing to pull out their wallet. The reason this happens is because the entrepreneur did not stay in touch with their customers throughout the entire development life-cycle. Don't build something that you "think" your customers will want. Speak with them. Talk to them. Find out their pain points and keep talking to them while you build.</div>
    <div><br></div>
    <div>Most importantly, stop worrying that someone is going to steal your idea. Honestly, building a product is the easy part. It's the marketing that is hard. And you won't be able to market effectively without keeping your potential customers in the loop as you build. </div>
    <div><br></div>
    <div>The "build it and they will come" mentality simply does not exist except in extremely rare circumstances. Talk to your ideas with other people, you'll be surprised what type of input you get.</div>
    <div><br></div>
    <div><strong>6. If folks are interested in learning more about your company/</strong></div>
    <div><strong>product, where should they go?</strong></div>
    <div><br></div>
    <div>If you are interested in learning more about ID My Pill, you can visit <a href="http://www.idmypill.com" rel="nofollow external" class="bo">www.idmypill.com</a> or send an email to <a href="mailto:adrian@idmypill.com">adrian@idmypill.com</a>.</div>
    </div>
    <div><br></div>
    <div><img src="https://mail.google.com/mail/u/0/?ui=2&amp;ik=47328088ca&amp;view=att&amp;th=14193ffb45cdcb35&amp;attid=0.1&amp;disp=thd&amp;realattid=f_hmhzfdn71&amp;zw" style="max-width: 100%; height: auto;"></div>
    </div>
]]>
</Body>
<Summary>Name: Adrian Rosebrock  Major: Computer Science  Academic Year: PhD student     1. Tell us a little about your company, and what makes your business   unique?     I am the Founder and CEO of ID My...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36976/guest@my.umbc.edu/652b75fc66a7f9e915e0dd6fcbeded6b/api/pixel</TrackingUrl>
<Tag>adrian</Tag>
<Tag>entrepreneur</Tag>
<Tag>idmypill</Tag>
<Tag>rosebrock</Tag>
<Tag>spotlight</Tag>
<Tag>student</Tag>
<Group token="entrepreneurship">Alex. Brown Center for Entrepreneurship</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/entrepreneurship</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/original.jpg?1771000363</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xlarge.png?1771000363</AvatarUrl>
<AvatarUrl size="large">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/large.png?1771000363</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/medium.png?1771000363</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/small.png?1771000363</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xsmall.png?1771000363</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/092/53c03b106bdc6e19e4bf0a41b5a37add/xxsmall.png?1771000363</AvatarUrl>
<Sponsor>The Alex. Brown Center for Entrepreneurship</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/xxlarge.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/xlarge.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/large.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/medium.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/small.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/xsmall.jpg?1381778458</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/976/8b212ddebb71de5f0118e2e9f170bd04/xxsmall.jpg?1381778458</ThumbnailUrl>
<PawCount>3</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 15:22:52 -0400</PostedAt>
<EditAt>Mon, 14 Oct 2013 22:04:10 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="36980" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36980">
<Title>In the Field: Time to Upgrade</Title>
<Body>
<![CDATA[
    <div class="html-content">The cost and work involved in a database upgrade are always a major consideration, but Oracle Database 12c includes features that can save time and cut costs.</div>
]]>
</Body>
<Summary>The cost and work involved in a database upgrade are always a major consideration, but Oracle Database 12c includes features that can save time and cut costs.</Summary>
<Website>http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53field-1995090.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36980/guest@my.umbc.edu/c666b7a277cf4a55df50e9392620ccfa/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>pl-sql</Tag>
<Tag>sql</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 15:16:53 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="36973" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36973">
<Title>Open Recreational Weight Room hours 10/14/13-10/20/13</Title>
<Tagline>Varsity weight room hours for this week</Tagline>
<Body>
<![CDATA[
    <div class="html-content">Below you will find the Athletic Weight Room Availability for general student body usage for this week; please note that these hours are determined by Athletic Weight Room Staff, not UMBC RAC or Group Fitness Staff.<br><br><u><strong>Monday</strong></u><br>8am-10am<br>8pm-10pm<br><br><u><strong>Tuesday</strong></u><br>1pm-2pm<br>4pm-6pm<br>8pm-10pm<br><u><strong><br>Wednesday </strong></u><br>2pm-3pm<br>8pm-10pm<br><br><u><strong>Thursday </strong></u><br>4pm-6pm<br>8pm-10pm<br><br><u><strong>Friday</strong></u><br>1pm-6pm<br>8pm-9pm<br><br><u><strong>Saturday</strong></u><br>1pm-7pm<br><br><u><strong>Sunday</strong></u><br>12pm-7pm<br>
    </div>
]]>
</Body>
<Summary>Below you will find the Athletic Weight Room Availability for general student body usage for this week; please note that these hours are determined by Athletic Weight Room Staff, not UMBC RAC or...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36973/guest@my.umbc.edu/03da23a97164bf2197d9c9429a76e8b3/api/pixel</TrackingUrl>
<Group token="recsports">Recreation at the RAC</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/recsports</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/xsmall.png?1661189624</AvatarUrl>
<AvatarUrl size="original">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/original.png?1661189624</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/xxlarge.png?1661189624</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/xlarge.png?1661189624</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/large.png?1661189624</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/medium.png?1661189624</AvatarUrl>
<AvatarUrl size="small">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/small.png?1661189624</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/xsmall.png?1661189624</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/257/f9c91c92f9b48ff33e640906e80bc588/xxsmall.png?1661189624</AvatarUrl>
<Sponsor>Recreation at the RAC</Sponsor>
<PawCount>5</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 14:26:30 -0400</PostedAt>
<EditAt>Mon, 14 Oct 2013 14:27:26 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="36975" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36975">
<Title>A Staff of Robots Can Clean and Install Solar Panels</Title>
<Body>
<![CDATA[
    <div class="html-content">With the price of solar panels falling, the industry is looking to labor savings to achieve its goal of make solar energy cheaper than natural gas.<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F10%2F15%2Fbusiness%2Fenergy-environment%2Fputting-robots-to-work-in-solar-energy.html%3Fpartner%3Drss%26emc%3Drss&amp;t=A+Staff+of+Robots+Can+Clean+and+Install+Solar+Panels" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F10%2F15%2Fbusiness%2Fenergy-environment%2Fputting-robots-to-work-in-solar-energy.html%3Fpartner%3Drss%26emc%3Drss&amp;t=A+Staff+of+Robots+Can+Clean+and+Install+Solar+Panels" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F10%2F15%2Fbusiness%2Fenergy-environment%2Fputting-robots-to-work-in-solar-energy.html%3Fpartner%3Drss%26emc%3Drss&amp;t=A+Staff+of+Robots+Can+Clean+and+Install+Solar+Panels" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F10%2F15%2Fbusiness%2Fenergy-environment%2Fputting-robots-to-work-in-solar-energy.html%3Fpartner%3Drss%26emc%3Drss&amp;t=A+Staff+of+Robots+Can+Clean+and+Install+Solar+Panels" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F10%2F15%2Fbusiness%2Fenergy-environment%2Fputting-robots-to-work-in-solar-energy.html%3Fpartner%3Drss%26emc%3Drss&amp;t=A+Staff+of+Robots+Can+Clean+and+Install+Solar+Panels" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/1/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/1/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/2/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/2/rc.img" style="max-width: 100%; height: auto;"></a><br><a href="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/3/rc.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/sc/32/kg/369/rc/3/rc.img" style="max-width: 100%; height: auto;"></a><br><br><a href="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/kg/369/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/176968651488/u/0/f/640387/c/34625/s/3272d6a4/kg/369/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>With the price of solar panels falling, the industry is looking to labor savings to achieve its goal of make solar energy cheaper than natural gas.      </Summary>
<Website>http://www.nytimes.com/2013/10/15/business/energy-environment/putting-robots-to-work-in-solar-energy.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36975/guest@my.umbc.edu/fbc553fba3bbe10641b7e92b97c30f3d/api/pixel</TrackingUrl>
<Tag>abb-ltd-abb-nyse</Tag>
<Tag>new</Tag>
<Tag>robots-and-robotics</Tag>
<Tag>solar-energy</Tag>
<Tag>start-ups</Tag>
<Tag>technology</Tag>
<Tag>trina-solar-ltd-tsl-nyse</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 14:17:47 -0400</PostedAt>
<EditAt>Mon, 14 Oct 2013 14:17:47 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="123026" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123026">
<Title>Ellen Handler Spitz, Honors College Professor, in Artcritical</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>The Museum of Modern Art in New York City is hosting an exhibit on Belgian Surrealist painter Rene Magritte. The show, <em>Magritte: The Mystery of the Ordinary, 1926-1938</em>, is running through January 12, 2014.</p>
    <p><a href="/wp-content/uploads/2013/10/32_magritte_le_blanc_seing.jpg" rel="nofollow external" class="bo"><img alt="Magritte painting" src="/wp-content/uploads/2013/10/32_magritte_le_blanc_seing.jpg" width="99" height="99" style="max-width: 100%; height: auto;"></a></p>
    <p><em>Artcritical </em>has published an article about Magritte by Honors College Professor Ellen Handler Spitz in conjunction with the exhibition.</p>
    <p>The show is attracting thousands of visitors from around the world. After New York City, it travels to Houston and then Chicago.</p>
    <p>You can read the full article by Ellen Handler Spitz <a href="http://www.artcritical.com/2013/10/09/magritte/" rel="nofollow external" class="bo">here</a>.</p>
    </div>
]]>
</Body>
<Summary>The Museum of Modern Art in New York City is hosting an exhibit on Belgian Surrealist painter Rene Magritte. The show, Magritte: The Mystery of the Ordinary, 1926-1938, is running through January...</Summary>
<Website>https://umbc.edu/stories/ellen-handler-spitz-honors-college-professor-in-artcritical/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123026/guest@my.umbc.edu/12ae657a77da58c2eb15b42d5927e1b2/api/pixel</TrackingUrl>
<Tag>arts-and-culture</Tag>
<Tag>cahss</Tag>
<Tag>honorscollege</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 14:13:35 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="36972" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36972">
<Title>Tips to Avoid Brittle UI Tests</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=35188&amp;c=275830513" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=35188&amp;c=275830513" alt="" style="max-width: 100%; height: auto;"></a><p>In the <a href="http://net.tutsplus.com/tutorials/maintainable-automated-ui-tests/" rel="nofollow external" class="bo">last article</a> I talked about a few ideas and patterns, like the Page Object pattern, that help write maintainable UI tests. In this article we are going to discuss a few advanced topics that could help you write more robust tests, and troubleshoot them when they fail:</p>
    <p></p>
    <ul>
    <li>We discuss why adding fixed delays in UI tests is a bad idea and how you can get rid of them.</li>
    <li>Browser automation frameworks target UI elements using selectors and it’s very critical to use good selectors to avoid brittle tests. So I give you some advice on choosing the right selectors and targeting elements directly when possible.</li>
    <li>UI tests fail more frequently then other types of tests, so how can we debug a broken UI test and figure out what caused the failure? In this section I show you how you can capture a screenshot and the page’s HTML source when a UI test fails so you can investigate it easier.</li>
    </ul>
    <p>I am going to use <a href="http://docs.seleniumhq.org/" rel="nofollow external" class="bo">Selenium</a> for the browser automation topics discussed in this article.</p>
    <p>Much like the previous article the concepts and solutions discussed in this article are applicable regardless of the language and UI framework you use. Before going any further please read the <a href="http://net.tutsplus.com/tutorials/maintainable-automated-ui-tests/" rel="nofollow external" class="bo">previous article</a> as I am going to refer to it and its sample code a few times. Don’t worry; I’ll wait here.</p>
    <hr>
    <h2>Don’t Add Delays to Your Tests</h2>
    <p>Adding <code>Thread.Sleep</code> (or generally delays) feels like an inevitable hack when it comes to UI testing. You have a test that fails intermittently and after some investigation you trace that back to occasional delays in the response; For example, you navigate to a page and look or assert for something before the page is fully loaded and your browser automation framework throws an exception indicating the element doesn’t exist. A lot of things could contribute to this delay. For example:</p>
    <ul>
    <li>The web server, the database and/or the network are overloaded and busy with other requests.</li>
    <li>The page under test is slow because it loads a lot of data and/or queries a lot of tables.</li>
    <li>You’re waiting for some event to happen on the page which takes time.</li>
    </ul>
    <p>Or a mix of these and other issues.</p>
    <p>Let’s say that you have a page that normally takes less than a second to load but the tests hitting it fail every now and then because of occasional lag in response. You have a few options:</p>
    <ul>
    <li>You don’t add a delay: in this case the tests that hit that page are sometimes going to fail which reduces your trust in the tests.</li>
    <li>You add a one-second delay to the tests hitting that page: in this case <em>all</em> of those tests are <em>always</em> going to take one second longer, even when the page loads fast, but even then the tests are not guaranteed to pass as the page might sometimes take longer then a second to load.</li>
    <li>You might decide to add a few-second delay: this makes sure the page is definitely always loaded, but now your UI tests are taking longer and longer.</li>
    </ul>
    <p>You see, there is no winning with arbitrary delays: you either get a slow or a brittle test suite. Here I am going to show you how to avoid inserting fixed delays in your tests. We are going to discuss two types of delays which should cover pretty much all cases you have to deal with: adding a global delay and waiting for something to happen.</p>
    <h3>Adding a Global Delay</h3>
    <p>If all of your pages take around the same time to load, which is longer than expected, then most tests are going to fail due to untimely response. In cases like this you can use <a href="http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits" rel="nofollow external" class="bo">Implicit Waits</a>:</p>
    <blockquote><p>An implicit wait is to tell WebDriver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available. The default setting is 0. Once set, the implicit wait is set for the life of the WebDriver object instance.</p></blockquote>
    <p>This is how you set an implicit wait:</p>
    <pre>WebDriver driver = new FirefoxDriver();&#x000A;    driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));&#x000A;    </pre>
    <p>This way you’re telling Selenium to wait up to 5 seconds when it tries to find an element or interact with the page. So now you can write:</p>
    <pre>driver.Url = "<a href="http://somedomain/url_that_delays_loading">http://somedomain/url_that_delays_loading</a>";&#x000A;    IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));&#x000A;    </pre>
    <p>instead of:</p>
    <pre>driver.Url = "<a href="http://somedomain/url_that_delays_loading">http://somedomain/url_that_delays_loading</a>";&#x000A;    Thread.Sleep(5000);&#x000A;    IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));&#x000A;    </pre>
    <p>The benefit of this approach is that <code>FindElement</code> will return as soon as it finds the element and doesn’t wait for the whole 5 seconds when the element is available sooner.</p>
    <p>Once implicit wait is set on your <code>WebDriver</code> instance it applies to all actions on the driver; so you can get rid of many <code>Thread.Sleep</code>s in your code.</p>
    <p>5 seconds is a wait I made up for this article – you should find the optimal implicit wait for your application and you should make this wait as short as possible. From the API documentations:</p>
    <blockquote><p>Increasing the implicit wait timeout should be used judiciously as it will have an adverse effect on test run time, especially when used with slower location strategies like XPath.</p></blockquote>
    <p>Even if you don’t use XPath, using long implicit waits slows down your tests, particularly when some tests are genuinely failing, because the web driver is going to wait for a long time before it times out and throws an exception.</p>
    <h3>Waiting for Explicit Events/Changes</h3>
    <p>Using implicit wait is a great way to get rid of many hardcoded delays in your code; but you are still going to find yourself in a situation where you need to add some fixed delays in your code because you’re waiting for something to happen: a page is slower than all other pages and you have to wait longer, you’re waiting for an AJAX call to finish or for an element to appear on or disappear from the page etc. This is where you need explicit waits.</p>
    <h4>Explicit Wait</h4>
    <p>So you have set the implicit wait to 5 seconds and it works for a lot of your tests; but there are still a few pages that sometimes take more than 5 seconds to load and result into failing tests.</p>
    <p>As a side note, you should investigate why a page is taking so long first, before trying to fix the broken test by making it wait longer. There might be a performance issue on the page that’s leading to the red test in which case you should fix the page, not the test.</p>
    <p>In case of a slow page you can replace fixed delays with <a href="http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits" rel="nofollow external" class="bo">Explicit Waits</a>:</p>
    <blockquote><p>An explicit waits is code you define to wait for a certain condition to occur before proceeding further in the code.</p></blockquote>
    <p>You can apply explicit waits using <code>WebDriverWait</code> class. <code>WebDriverWait</code> lives in <code>WebDriver.Support</code> assembly and can be installed using <a href="https://www.nuget.org/packages/selenium.support" rel="nofollow external" class="bo">Selenium.Support</a> nuget:</p>
    <pre>/// &lt;summary&gt;&#x000A;    /// Provides the ability to wait for an arbitrary condition during test execution.&#x000A;    /// &lt;/summary&gt;&#x000A;    public class WebDriverWait : DefaultWait&lt;IWebDriver&gt;&#x000A;    {&#x000A;      /// &lt;summary&gt;&#x000A;      /// Initializes a new instance of the &lt;see cref="T:OpenQA.Selenium.Support.UI.WebDriverWait"/&gt; class.&#x000A;      /// &lt;/summary&gt;&#x000A;      /// &lt;param name="driver"&gt;The WebDriver instance used to wait.&lt;/param&gt;&lt;param name="timeout"&gt;The timeout value indicating how long to wait for the condition.&lt;/param&gt;&#x000A;      public WebDriverWait(IWebDriver driver, TimeSpan timeout);&#x000A;    &#x000A;      /// &lt;summary&gt;&#x000A;      /// Initializes a new instance of the &lt;see cref="T:OpenQA.Selenium.Support.UI.WebDriverWait"/&gt; class.&#x000A;      /// &lt;/summary&gt;&#x000A;      /// &lt;param name="clock"&gt;An object implementing the &lt;see cref="T:OpenQA.Selenium.Support.UI.IClock"/&gt; interface used to determine when time has passed.&lt;/param&gt;&lt;param name="driver"&gt;The WebDriver instance used to wait.&lt;/param&gt;&lt;param name="timeout"&gt;The timeout value indicating how long to wait for the condition.&lt;/param&gt;&lt;param name="sleepInterval"&gt;A &lt;see cref="T:System.TimeSpan"/&gt; value indicating how often to check for the condition to be true.&lt;/param&gt;&#x000A;      public WebDriverWait(IClock clock, IWebDriver driver, TimeSpan timeout, TimeSpan sleepInterval);&#x000A;    }&#x000A;    </pre>
    <p>Here is an example of how you can use <code>WebDriverWait</code> in your tests:</p>
    <pre>driver.Url = "<a href="http://somedomain/url_that_takes_a_long_time_to_load">http://somedomain/url_that_takes_a_long_time_to_load</a>";&#x000A;    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));&#x000A;    var myDynamicElement = wait.Until(d =&gt; d.FindElement(By.Id("someElement")));&#x000A;    </pre>
    <p>We are telling Selenium that we want it to wait for this particular page/element for up to 10 seconds.</p>
    <p>You are likely to have a few pages that take longer than your default implicit wait and it’s not a good coding practice to keep repeating this code everywhere. After all <em>Test Code Is Code</em>. You could instead extract this into a method and use it from your tests:</p>
    <pre>public IWebElement FindElementWithWait(By by, int secondsToWait = 10)&#x000A;    {&#x000A;        var wait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(secondsToWait));&#x000A;        return wait.Until(d =&gt; d.FindElement(by));&#x000A;    }&#x000A;    </pre>
    <p>Then you can use this method as:</p>
    <pre>var slowPage = new SlowPage("<a href="http://somedomain/url_that_takes_a_long_time_to_load">http://somedomain/url_that_takes_a_long_time_to_load</a>");&#x000A;    var element = slowPage.FindElementWithWait(By.Id("someElement"));&#x000A;    </pre>
    <p>This is a contrived example to show what the method could potentially look like and how it could be used. Ideally you would move all page interactions to your page objects.</p>
    <h3>Alternative Explicit Wait Example</h3>
    <p>Let’s see another example of an explicit wait. Sometimes the page is fully loaded but the element isn’t there yet because it is later loaded as the result of an AJAX request. Maybe it’s not an element you’re waiting for but just want to wait for an AJAX interaction to finish before you can make an assertion, say in the database. Again this is where most developers use <code>Thread.Sleep</code> to make sure that, for example, that AJAX call is done and the record is now in the database before they proceed to the next line of the test. This can be easily rectified using JavaScript execution!</p>
    <p>Most browser automation frameworks allow you to run JavaScript on the active session, and <a href="http://docs.seleniumhq.org/docs/03_webdriver.jsp#using-javascript" rel="nofollow external" class="bo">Selenium is no exception</a>. In Selenium there is an interface called <code>IJavaScriptExecutor</code> with two methods:</p>
    <pre>/// &lt;summary&gt;&#x000A;    /// Defines the interface through which the user can execute JavaScript.&#x000A;    /// &lt;/summary&gt;&#x000A;    public interface IJavaScriptExecutor&#x000A;    {&#x000A;        /// &lt;summary&gt;&#x000A;        /// Executes JavaScript in the context of the currently selected frame or window.&#x000A;        /// &lt;/summary&gt;&#x000A;        /// &lt;param name="script"&gt;The JavaScript code to execute.&lt;/param&lt;&lt;param name="args"&lt;The arguments to the script.&lt;/param&gt;&#x000A;        /// &lt;returns&gt;&#x000A;        /// The value returned by the script.&#x000A;        /// &lt;/returns&gt;&#x000A;        object ExecuteScript(string script, params object[] args);&#x000A;    &#x000A;        /// &lt;summary&gt;&#x000A;        /// Executes JavaScript asynchronously in the context of the currently selected frame or window.&#x000A;        /// &lt;/summary&gt;&#x000A;        /// &lt;param name="script"&gt;The JavaScript code to execute.&lt;/param&lt;&lt;param name="args"&lt;The arguments to the script.&lt;/param&gt;&#x000A;        /// &lt;returns&gt;&#x000A;        /// The value returned by the script.&#x000A;        /// &lt;/returns&gt;&#x000A;        object ExecuteAsyncScript(string script, params object[] args);&#x000A;    }&#x000A;    </pre>
    <p>This interface is implemented by <code>RemoteWebDriver</code> which is the base class for all web driver implementations. So on your web driver instance you can call <code>ExecuteScript</code> to run a JavaScript script. Here is a method you can use to wait for all AJAX calls to finish (assuming you are using jQuery):</p>
    <pre>// This is assumed to live in a class that has access to the active `WebDriver` instance through `WebDriver` field/property. &#x000A;    public void WaitForAjax(int secondsToWait = 10)&#x000A;    {&#x000A;        var wait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(secondsToWait));&#x000A;        wait.Until(d =&gt; (bool)((IJavaScriptExecutor)d).ExecuteScript("return jQuery.active == 0"));&#x000A;    }&#x000A;    </pre>
    <p>Combine the <code>ExecuteScript</code> with <code>WebDriverWait</code> and you can get rid of <code>Thread.Sleep</code> added for AJAX calls.</p>
    <p><code>jQuery.active</code> returns the number of active AJAX calls <em>initiated by jQuery</em>; so when it is zero there are no AJAX calls in progress. This method obviously only works if all AJAX requests are initiated by jQuery. If you are using other JavaScript libraries for AJAX communications you should consult its API documentations for an equivalent method or keep track of AJAX calls yourself.</p>
    <h4>ExpectedCondition</h4>
    <p>With explicit wait you can set a condition and wait until it is met or for the timeout to expire. We saw how we could check for AJAX calls to finish – another example is checking for visibility of an element. Just like the AJAX check, you could write a condition that checks for the visibility of an element; but there is an easier solution for that called <code>ExpectedCondition</code>.</p>
    <p>From <a href="http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#expected-conditions" rel="nofollow external" class="bo">Selenium documentation</a>:</p>
    <blockquote><p>There are some common conditions that are frequently come across when automating web browsers.</p></blockquote>
    <p>If you are using Java you’re in luck because <code>ExpectedCondition</code> class in Java is quite extensive and has a lot of convenience methods. You can find the documentation <a href="http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html" rel="nofollow external" class="bo">here</a>.</p>
    <p>.Net developers are not quite as lucky. There is still an <code>ExpectedConditions</code> class in <code>WebDriver.Support</code> assembly (documented <a href="http://selenium.googlecode.com/git/docs/api/dotnet/html/AllMembers_T_OpenQA_Selenium_Support_UI_ExpectedConditions.htm" rel="nofollow external" class="bo">here</a>) but it’s very minimal:</p>
    <pre>public sealed class ExpectedConditions&#x000A;    {&#x000A;         /// &lt;summary&gt;&#x000A;         /// An expectation for checking the title of a page.&#x000A;         /// &lt;/summary&gt;&#x000A;         /// &lt;param name="title"&gt;The expected title, which must be an exact match.&lt;/param&gt;&#x000A;         /// &lt;returns&gt;&#x000A;         /// &lt;see langword="true"/&gt; when the title matches; otherwise, &lt;see langword="false"/&gt;.&#x000A;         /// &lt;/returns&gt;&#x000A;         public static Func&lt;IWebDriver, bool&gt; TitleIs(string title);&#x000A;    &#x000A;         /// &lt;summary&gt;&#x000A;         /// An expectation for checking that the title of a page contains a case-sensitive substring.&#x000A;         /// &lt;/summary&gt;&#x000A;         /// &lt;param name="title"&gt;The fragment of title expected.&lt;/param&gt;&#x000A;         /// &lt;returns&gt;&#x000A;         /// &lt;see langword="true"/&gt; when the title matches; otherwise, &lt;see langword="false"/&gt;.&#x000A;         /// &lt;/returns&gt;&#x000A;         public static Func&lt;IWebDriver, bool&gt; TitleContains(string title);&#x000A;    &#x000A;         /// &lt;summary&gt;&#x000A;         /// An expectation for checking that an element is present on the DOM of a&#x000A;         /// page. This does not necessarily mean that the element is visible.&#x000A;         /// &lt;/summary&gt;&#x000A;         /// &lt;param name="locator"&gt;The locator used to find the element.&lt;/param&gt;&#x000A;         /// &lt;returns&gt;&#x000A;         /// The &lt;see cref="T:OpenQA.Selenium.IWebElement"/&gt; once it is located.&#x000A;         /// &lt;/returns&gt;&#x000A;         public static Func&lt;IWebDriver, IWebElement&gt; ElementExists(By locator);&#x000A;    &#x000A;         /// &lt;summary&gt;&#x000A;         /// An expectation for checking that an element is present on the DOM of a page&#x000A;         /// and visible. Visibility means that the element is not only displayed but&#x000A;         /// also has a height and width that is greater than 0.&#x000A;         /// &lt;/summary&gt;&#x000A;         /// &lt;param name="locator"&gt;The locator used to find the element.&lt;/param&gt;&#x000A;         /// &lt;returns&gt;&#x000A;         /// The &lt;see cref="T:OpenQA.Selenium.IWebElement"/&gt; once it is located and visible.&#x000A;         /// &lt;/returns&gt;&#x000A;         public static Func&lt;IWebDriver, IWebElement&gt; ElementIsVisible(By locator);&#x000A;    }&#x000A;    </pre>
    <p>You can use this class in combination with <code>WebDriverWait</code>:</p>
    <pre>var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(3))&#x000A;    var element = wait.Until(ExpectedConditions.ElementExists(By.Id("foo")));&#x000A;    </pre>
    <p>As you can see from the class signature above you can check for the title or parts of it and for existence and visibility of elements using <code>ExpectedCondition</code>. The out of the box support in .Net might be very minimal; but this class is nothing but a wrapper around some simple conditions. You can just as easily implement other common conditions in a class and use it with <code>WebDriverWait</code> from your test scripts.</p>
    <h4>FluentWait</h4>
    <p>Another gem only for Java developers is <code>FluentWait</code>. From the <a href="http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html" rel="nofollow external" class="bo">documentation page</a>, <code>FluentWait</code> is</p>
    <blockquote><p>An implementation of the Wait interface that may have its timeout and polling interval configured on the fly. Each FluentWait instance defines the maximum amount of time to wait for a condition, as well as the frequency with which to check the condition. Furthermore, the user may configure the wait to ignore specific types of exceptions whilst waiting, such as NoSuchElementExceptions when searching for an element on the page.</p></blockquote>
    <p>In the following example we’re trying to find an element with id <code>foo</code> on the page polling every five seconds for up to 30 seconds:</p>
    <pre>// Waiting 30 seconds for an element to be present on the page, checking&#x000A;    // for its presence once every five seconds.&#x000A;    Wait&lt;WebDriver&gt; wait = new FluentWait&lt;WebDriver&gt;(driver)&#x000A;        .withTimeout(30, SECONDS)&#x000A;        .pollingEvery(5, SECONDS)&#x000A;        .ignoring(NoSuchElementException.class);&#x000A;    &#x000A;    WebElement foo = wait.until(new Function&lt;WebDriver, WebElement&gt;() {&#x000A;      public WebElement apply(WebDriver driver) {&#x000A;        return driver.findElement(By.id("foo"));&#x000A;      }&#x000A;    });&#x000A;    </pre>
    <p>There are two outstanding things about <code>FluentWait</code>: firstly it allows you to specify the polling interval which could improve your test performance and secondly it allows you to ignore the exceptions you are not interested in.</p>
    <p><code>FluentWait</code> is quite awesome and it would be cool if an equivalent existed in .Net too. That said it’s not that hard to implement it using <code>WebDriverWait</code>.</p>
    <hr>
    <h2>Choose the Right Selectors</h2>
    <p>You have your Page Objects in place, have a nice DRY maintainable test code, and are also avoiding fixed delays in your tests; but your tests still fail!</p>
    <p>The UI is usually the most frequently changed part of a typical application: sometimes you move elements around on a page to change the design of the page and sometimes page structure changes based on requirements. These changes on the page layout and design could lead to a lot of broken tests if you don’t choose your selectors wisely.</p>
    <p><em>Do not use fuzzy selectors and do not rely on the structure of your page.</em></p>
    <p>Many times I have been asked if it’s ok to add an ID to elements on the page only for testing, and the answer is a resounding yes. To make our code unit testable we make a lot of changes to it like adding interfaces and using Dependency Injection. Test Code Is Code. Do what it takes to support your tests.</p>
    <p>Let’s say we have a page with the following list:</p>
    <pre>&lt;ul id="album-list"&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a href="/Store/Details/6"&gt;&#x000A;                &lt;span&gt;The Best Of Men At Work&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a href="/Store/Details/12"&gt;&#x000A;                &lt;span&gt;For Those About To Rock We Salute You&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a href="/Store/Details/35"&gt;&#x000A;                &lt;span&gt;Let There Be Rock&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;    &lt;/ul&gt;&#x000A;    </pre>
    <p>In one of my tests I want to click on the “Let There Be Rock” album. I would be asking for trouble if I used the following selector:</p>
    <pre>By.XPath("//ul[@id='album-list']/li[3]/a")&#x000A;    </pre>
    <p>When possible you should add ID to elements and target them directly and without relying on their surrounding elements. So I am going to make a small change to the list:</p>
    <pre>&lt;ul id="album-list"&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a id="album-6" href="/Store/Details/6"&gt;&#x000A;                &lt;span&gt;The Best Of Men At Work&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a id="album-12" href="/Store/Details/12"&gt;&#x000A;                &lt;span&gt;For Those About To Rock We Salute You&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;        &lt;li&gt;&#x000A;            &lt;a id="album-35" href="/Store/Details/35"&gt;&#x000A;                &lt;span&gt;Let There Be Rock&lt;/span&gt; &#x000A;            &lt;/a&gt;&#x000A;        &lt;/li&gt;&#x000A;    &lt;/ul&gt;&#x000A;    </pre>
    <p>I have added <code>id</code> attributes to anchors based on the unique albums’ id so we can target a link directly without having to go through <code>ul</code> and <code>li</code> elements. So now I can replace the brittle selector with <code>By.Id("album-35")</code> which is guaranteed to work as long as that album is on the page, which by the way is a good assertion too. To create that selector I would obviously have to have access to the album id from the test code.</p>
    <p>It is not always possible to add unique ids to elements though, like rows in a grid or elements in a list. In cases like this you can use CSS classes and HTML data attributes to attach traceable properties to your elements for easier selection. For example, if you had two lists of albums in your page, one as the result of user search and another one for suggested albums based on user’s previous purchases, you can differentiate them using a CSS class on the <code>ul</code> element, even if that class is not used for styling the list:</p>
    <pre>&lt;ul class="suggested-albums"&gt;&#x000A;    &lt;/ul&gt;&#x000A;    </pre>
    <p>If you prefer not to have unused CSS classes you could instead use HTML data attributes and change the lists to:</p>
    <pre>&lt;ul data-albums="suggested"&gt;&#x000A;    &lt;/ul&gt;&#x000A;    </pre>
    <p>and:</p>
    <pre>&lt;ul data-albums="search-result"&gt;&#x000A;    &lt;/ul&gt;&#x000A;    </pre>
    <hr>
    <h2>Debugging UI Tests</h2>
    <p>One of the main reasons UI tests fail is that an element or text is not found on the page. Sometimes this happens because you land on a wrong page because of navigation errors, or changes to page navigations in your website, or validation errors. Other times it could be because of a missing page or a server error.</p>
    <p>Regardless of what causes the error and whether you get this on your CI server log or in your desktop test console, a <code>NoSuchElementException</code> (or the like) is not quite useful for figuring out what went wrong, is it? So when your test fails the only way to troubleshoot the error is to run it again and watch it as it fails. There are a few tricks that could potentially save you from re-running your slow UI tests for troubleshooting. One solution to this is to capture a screenshot whenever a test fails so we can refer back to it later.</p>
    <p>There is an interface in Selenium called <code>ITakesScreenshot</code>:</p>
    <pre>/// &lt;summary&gt;&#x000A;    /// Defines the interface used to take screen shot images of the screen.&#x000A;    /// &lt;/summary&gt;&#x000A;    public interface ITakesScreenshot&#x000A;    {&#x000A;      /// &lt;summary&gt;&#x000A;      /// Gets a &lt;see cref="T:OpenQA.Selenium.Screenshot"/&gt; object representing the image of the page on the screen.&#x000A;      /// &lt;/summary&gt;&#x000A;      /// &#x000A;      /// &lt;returns&gt;&#x000A;      /// A &lt;see cref="T:OpenQA.Selenium.Screenshot"/&gt; object containing the image.&#x000A;      /// &lt;/returns&gt;&#x000A;      Screenshot GetScreenshot();&#x000A;    }&#x000A;    </pre>
    <p>This interface is implemented by web driver classes and can be used like this:</p>
    <pre>var screenshot = driver.GetScreenshot();&#x000A;    screenshot.SaveAsFile("&lt;destination file's full path&gt;", ImageFormat.Png);&#x000A;    </pre>
    <p>This way when a test fails because you’re on a wrong page you can quickly figure it out by checking the captured screenshot.</p>
    <p>Even capturing screenshots is not always enough though. For example, you might see the element you expect on the page but the test still fails saying it doesn’t find it, perhaps due to the wrong selector that leads to unsuccessful element lookup. So instead of (or to complement) the screenshot, you could also capture the page source as html. There is a <code>PageSource</code> property on <code>IWebDriver</code> interface (which is implemented by all web drivers):</p>
    <pre>/// &lt;summary&gt;&#x000A;    /// Gets the source of the page last loaded by the browser.&#x000A;    /// &lt;/summary&gt;&#x000A;    /// &lt;remarks&gt;&#x000A;    /// If the page has been modified after loading (for example, by JavaScript)&#x000A;    /// there is no guarantee that the returned text is that of the modified page.&#x000A;    /// Please consult the documentation of the particular driver being used to&#x000A;    /// determine whether the returned text reflects the current state of the page&#x000A;    /// or the text last sent by the web server. The page source returned is a&#x000A;    /// representation of the underlying DOM: do not expect it to be formatted&#x000A;    /// or escaped in the same way as the response sent from the web server.&#x000A;    /// &lt;/remarks&gt;&#x000A;    string PageSource { get; }&#x000A;    </pre>
    <p>Just like we did with <code>ITakesScreenshot</code> you could implement a method that grabs the page source and persists it to a file for later inspection:</p>
    <pre>File.WriteAllText("&lt;Destination file's full path&gt;", driver.PageSource);&#x000A;    </pre>
    <p>You don’t really want to capture screenshots and page sources of all pages you visit and for the passing tests; otherwise you will have to go through thousands of them when something actually goes wrong. Instead you should only capture them when a test fails or otherwise when you need more information for troubleshooting. To avoid polluting the code with too many try-catch blocks and to avoid code duplications you should put all your element lookups and assertions in one class and wrap them with try-catch and then capture the screenshot and/or page source in the catch block. Here is a bit of code you could use for executing actions against an element:</p>
    <pre>public void Execute(By by, Action&lt;IWebElement&gt; action)&#x000A;    {&#x000A;        try&#x000A;        {&#x000A;            var element = WebDriver.FindElement(by);&#x000A;            action(element);&#x000A;        }&#x000A;        catch&#x000A;        {&#x000A;            var capturer = new Capturer(WebDriver);&#x000A;            capturer.CaptureScreenshot();&#x000A;            capturer.CapturePageSource();&#x000A;            throw;&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>The <code>Capturer</code> class can be implemented as:</p>
    <pre>public class Capturer&#x000A;    {&#x000A;        public static string OutputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FailedTests");&#x000A;    &#x000A;        private readonly RemoteWebDriver _webDriver;&#x000A;    &#x000A;        public Capturer(RemoteWebDriver webDriver)&#x000A;        {&#x000A;            _webDriver = webDriver;&#x000A;        }&#x000A;    &#x000A;        public void CaptureScreenshot(string fileName = null)&#x000A;        {&#x000A;            var camera = (ITakesScreenshot) _webDriver;&#x000A;            var screenshot = camera.GetScreenshot();&#x000A;    &#x000A;            var screenShotPath = GetOutputFilePath(fileName, "png");&#x000A;            screenshot.SaveAsFile(screenShotPath, ImageFormat.Png);&#x000A;        }&#x000A;    &#x000A;        public void CapturePageSource(string fileName = null)&#x000A;        {&#x000A;            var filePath = GetOutputFilePath(fileName, "html");&#x000A;            File.WriteAllText(filePath, _webDriver.PageSource);&#x000A;        }&#x000A;    &#x000A;        private string GetOutputFilePath(string fileName, string fileExtension)&#x000A;        {&#x000A;            if (!Directory.Exists(OutputFolder))&#x000A;                Directory.CreateDirectory(OutputFolder);&#x000A;    &#x000A;            var windowTitle = _webDriver.Title;&#x000A;            fileName = fileName ??&#x000A;                       string.Format("{0}{1}.{2}", windowTitle, DateTime.Now.ToFileTime(), fileExtension).Replace(':', '.');&#x000A;            var outputPath = Path.Combine(OutputFolder, fileName);&#x000A;            var pathChars = Path.GetInvalidPathChars();&#x000A;            var stringBuilder = new StringBuilder(outputPath);&#x000A;    &#x000A;            foreach (var item in pathChars)&#x000A;                stringBuilder.Replace(item, '.');&#x000A;    &#x000A;            var screenShotPath = stringBuilder.ToString();&#x000A;            return screenShotPath;&#x000A;        }&#x000A;    }&#x000A;    </pre>
    <p>This implementation persists the screenshot and HTML source in a folder called FailedTests next to the tests, but you can modify it if you want different behavior.</p>
    <p>Although I only showed methods specific to Selenium, similar APIs exist in all automation frameworks I know and can be easily used.</p>
    <hr>
    <h2>Conclusion</h2>
    <p>In this article we talked about a few UI testing tips and tricks. We discussed how you can avoid a brittle and slow UI test suite by avoiding fixed delays in your tests. We then discussed how to avoid brittle selectors and tests by choosing selectors wisely and also how to debug your UI tests when they fail.</p>
    <p>Most of the code shown in this article can be found in the <a href="https://github.com/tutsplus/maintainable-automated-ui-tests/tree/master/src/MvcMusicStore" rel="nofollow external" class="bo">MvcMusicStore sample</a> repository that we saw in the last article. It’s also worth noting that a lot of code in the MvcMusicStore was borrowed from the <a href="https://github.com/TestStack/TestStack.Seleno" rel="nofollow external" class="bo">Seleno codebase</a>, so if you want to see a lot of cool tricks you might want to check Seleno out. Disclaimer: I am a co-founder of TestStack organization and a contributor on Seleno.</p>
    <p>I hope what we’ve discussed in this article helps you in your UI testing endeavors.</p>
    </div>
]]>
</Body>
<Summary>In the last article I talked about a few ideas and patterns, like the Page Object pattern, that help write maintainable UI tests. In this article we are going to discuss a few advanced topics that...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/aHpy4CNnSJ4/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36972/guest@my.umbc.edu/b177f2cad838230046503361e76832fe/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tips</Tag>
<Tag>tools-and-tips</Tag>
<Tag>tutorials</Tag>
<Tag>ui-tests</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 13:10:34 -0400</PostedAt>
<EditAt>Mon, 14 Oct 2013 13:10:34 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="36970" important="false" status="posted" url="https://my3.my.umbc.edu/posts/36970">
<Title>UMBC's CyberDawgs Place 2nd in Maryland Cyber Challenge</Title>
<Body>
<![CDATA[
    <div class="html-content">UMBC's CyberDawgs placed second at the 2013 Maryland Cyber Challenge (MDC3) finals held in Baltimore on Oct. 9 as part of the CyberMaryland 2013 Conference. <div>
    <div><br></div>
    <div>
    <div>During the finals, teams competed in a Control-the-Flag event where they attempted to gain (and maintain) control of other systems on the network – which were also being targeted by other teams seeking to gain and ‘own’ them as well.</div>
    <div><br></div>
    <div>All of UMBC’s three CyberDawg teams competed vigorously throughout the MDC3 season and maintained a very tight scoring situation for the college division. However, by taking second place in today’s finals, each member of CyberDawgs-1 will receive a $2,000 cash prize provided by the National Security Agency.</div>
    </div>
    <div><br></div>
    <div>Dr. Richard Forno and Dr. Charles Nicholas are faculty advisors to the team. UMBC is a co-founder of the Maryland Cyber Challenge.</div>
    </div>
    <div><br></div>
    <div>
    <a href="http://www.csee.umbc.edu/2013/10/cyberdawgs-take-2nd-at-mdc3-2013-finals/" rel="nofollow external" class="bo">Read the original story posted on the CSEE website.</a> </div>
    </div>
]]>
</Body>
<Summary>UMBC's CyberDawgs placed second at the 2013 Maryland Cyber Challenge (MDC3) finals held in Baltimore on Oct. 9 as part of the CyberMaryland 2013 Conference.       During the finals, teams competed...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/36970/guest@my.umbc.edu/b59af613e497352f50cec589f14a58b7/api/pixel</TrackingUrl>
<Tag>cyber</Tag>
<Group token="dps">UMBC Professional Programs</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/dps</GroupUrl>
<AvatarUrl>https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/xsmall.png?1642086701</AvatarUrl>
<AvatarUrl size="original">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/original.png?1642086701</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/xxlarge.png?1642086701</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/xlarge.png?1642086701</AvatarUrl>
<AvatarUrl size="large">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/large.png?1642086701</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/medium.png?1642086701</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/small.png?1642086701</AvatarUrl>
<AvatarUrl size="xsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/xsmall.png?1642086701</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/513/2e72ed76b7b3b9ce2f15fce64178dfaf/xxsmall.png?1642086701</AvatarUrl>
<Sponsor>Division of Professional Studies</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/xxlarge.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/xlarge.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/large.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/medium.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/small.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/xsmall.jpg?1381769300</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/036/970/1b4f2f6f94b053e3a32726e62b85db9c/xxsmall.jpg?1381769300</ThumbnailUrl>
<PawCount>5</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Mon, 14 Oct 2013 12:50:29 -0400</PostedAt>
</NewsItem>

</News>
