Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium - driver.find_element_by_css_selector can't find the element (python)

I got a problem to use "find_element_by_css_selector" to get the element "Select" (a href).

I tried the methods below but all of them didn't work:

driver.find_element_by_css_selector("div.plan.right > a.select.").click()
driver.find_element_by_xpath("//div[@class='plan right']/div[2]/a/select").click()

Could anyone kindly give me some suggestions? Thanks!!

<div class="choose_plan">
   <h1>Sign up now for <strong>UNLIMITED</strong> access <br/>to all </h1>
   <div class="plans">
      <div class="plan left">
         <div class="head">
            <p>MONTHLY</p>
         </div>
         <div class="body">
            <p>annually</p>
         </div>
         <hr />
         <a href="/bbb?plan_id=6" class="select signup-dialog" data-planId="6" data-url="/users/new?r">SELECT</a>
      </div>
      <div class="plan right">
         <img alt="Popular-right" class="popular" src="/assetse8.png" />
         <div class="head">
            <p>14</p>
         </div>
         <div class="body">
            <p>Unlimited</p>
         </div>
         <hr />
         <a href="/account/purchase?plan_id=31" class="select signup-dialog" data-planId="31" data-url="/users/new?aaa">SELECT</a>
      </div>
   </div>
</div>
like image 686
betty Avatar asked Oct 01 '15 02:10

betty


3 Answers

I know you already have an answer but there's a simple alternative that may be helpful in the future. From the HTML you provided, it looks like the data-planId attribute is unique for each A tag. You can take advantage of that using the code below.

driver.find_element_by_css_selector("a[data-planId='31']")

See this CSS Selector reference for more info.

like image 88
JeffC Avatar answered Nov 17 '22 16:11

JeffC


It would help to have well formed HTML, as line 15 (<div class="choose_plan">) appears to be unclosed. This solution below was done with this line removed, but the rest of the HTML as shown. You can test online XPath here.

driver.find_element_by_xpath("//div[@class='plan right']/a").click()

yields the following:

Element='<a href="/account/purchase?plan_id=31" class="select signup-dialog" data-planId="31" data-url="/users/new?aaa">SELECT</a>'
like image 24
Thane Plummer Avatar answered Nov 17 '22 15:11

Thane Plummer


I would try to make it simple:

driver.find_element_by_css_selector("div.right a.select")

Or:

driver.find_elements_by_link_text("SELECT")[-1]

Here we are basically getting the last a element having SELECT text.

like image 1
alecxe Avatar answered Nov 17 '22 16:11

alecxe