Ben Schmidt
Ben Schmidt

Reputation: 67

Selenium webdriver help finding a element


my goal is to get a screenshot of a specific element that occurs several times.
Example URL: , I want to get https://i.imgur.com/kcd98bQ.png

So I looked into the code and found: `Complementary results` , unfortunately
`element = driver.find_elements_by_class_name("Uo8X3b")`
doesn't do the trick because `class="Uo8X3b"` occurs several times:

<h1 class="Uo8X3b">Accessibility links</h1>
<h1 class="Uo8X3b">Search modes</h1>
<h1 class="Uo8X3b">Search Results</h1><
<h2 class="Uo8X3b">Web results</h2>
<h2 class="Uo8X3b">Notices about Filtered Results</h2>
<h1 class="Uo8X3b">Page navigation</h1>
<h2 class="Uo8X3b">Complementary results</h2>
<h3 class="Uo8X3b">Images</h3>
<h2 class="Uo8X3b">Description</h2>
<h2 class="Uo8X3b">Description</h2>
<h1 class="Uo8X3b">Footer links</h1>

After reading https://selenium-python.readthedocs.io/locating-elements.html I am out of ideas.

my python code

#!/usr/bin/env python3
  
# import webdriver 
from selenium import webdriver 
from selenium.webdriver.chrome.options import Options
from PIL import Image
  
# create webdriver object 
options = Options()
#options.headless = True
driver = webdriver.Chrome(options=options, executable_path=r'/usr/bin/chromedriver')
  
driver.get("https://www.google.com/search?q=elon%20musk")
  
# get element  

element = driver.find_elements_by_class_name("Uo8X3b")
  
# print complete element 
print(element) 

exit()

Result:

[<selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="0c5b38af-7350-4d54-968e-2dbf1bcfd590")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="59f03910-6787-4009-9793-c9f2ad2fb42b")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="d124b2ca-ac51-401f-9e9c-653627af439c")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="35728814-738c-4f45-92cc-2c1353fdda0a")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="b1491e4c-7d69-4ca1-b0b5-a2cf56382041")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="70774d08-5e42-499e-9e81-8c7a61763a63")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="3e9ef6a4-9013-4421-810d-6a0a9f2357ce")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="289735b1-3685-4f9a-9156-f1af4a3d1ebf")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="b6a2eda1-8038-4dd1-9047-36cf263863c1")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="ebe87746-7bf3-495c-8660-3ca823c6e4b1")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="de8af129-a648-4862-a7de-c9486e7d16e2")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="ce4de9f5-337f-4151-8a0a-e289bc9d7d2a")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="456b2fbf-353b-4de9-b6ad-6377d13addbd")>, <selenium.webdriver.remote.webelement.WebElement (session="7bc20d0d87be84ee463612341bbd4d1e", element="3e877977-2e16-4639-a497-c4099f83a872")>]

How can I limit the search to only find the element <h2 class="Uo8X3b">Complementary results</h2>

Thanks very much in advance!



BTW: Working code for duckduckgo.com

#!/usr/bin/env python3
  
# import webdriver 
from selenium import webdriver 
from selenium.webdriver.chrome.options import Options
from PIL import Image
  
# create webdriver object 
options = Options()
#options.headless = True
driver = webdriver.Chrome(options=options, executable_path=r'/usr/bin/chromedriver')
driver.get("https://duckduckgo.com/?q=elon+musk")
  
# get element  
element = driver.find_element_by_class_name("module__body") 
  
# print complete element 
print(element) 

location = element.location
size = element.size

driver.save_screenshot("shot.png")

x = location['x']
y = location['y']
w = size['width']
h = size['height']
width = x + w
height = y + h

im = Image.open('shot.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('image.png')

Upvotes: 0

Views: 118

Answers (1)

PDHide
PDHide

Reputation: 19979

Use the xpath

 //h2[@class="Uo8X3b" and contains(text(),"Complementary"]

Or

 //h2[@class="Uo8X3b" and text()="Complementary results"]

Second will search for exact text first will search for substring

Upvotes: 1

Related Questions