Python selenium.webdriver.common.by.By 模块,CSS_SELECTOR 实例源码
我们从Python开源项目中,提取了以下50个代码示例,用于说明如何使用selenium.webdriver.common.by.By.CSS_SELECTOR。
def wait_for_presence(self, selector='', **kwargs):
'''
Wait for an element to be present. (Does not need to be visible.)
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.presence_of_element_located((by, selector)) or
EC.presence_of_elements_located((by, selector)),
**kwargs)
def wait_for_clickable(self, **kwargs):
'''
Wait for an element to be clickable.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.element_to_be_clickable((by, **kwargs)
def wait_for_visible(self, **kwargs):
'''
Wait for an element to be visible.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.visibility_of_element_located((by,
**kwargs)
def wait_for_invisible(self, **kwargs):
'''
Wait for an element to be invisible.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.invisibility_of_element_located((by,
**kwargs)
def wait_for_text(self, text='', **kwargs):
'''
Wait for an element to contain a specific string.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
text: str
The string to look for. This must be precise.
(Case,punctuation,UTF characters... etc.)
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.text_to_be_present_in_element((by, selector),
text), **kwargs)
def wait_for_selected(self, selected=True, **kwargs):
'''
Wait for an element (checkBox/radio) to be selected.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
selected: bool
Whether or not the element should be selected. Default True
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.element_located_selection_state_to_be((by,
selected), **kwargs)
def wait_for_value(self, value='', **kwargs):
'''
Wait for an element to contain a specific string.
Parameters
----------
selector: str
A CSS selector to search for. This can be any valid CSS selector.
value: str
The string to look for. This must be precise.
(Case,UTF characters... etc.)
kwargs:
Passed on to _wait_for
'''
if selector.startswith('/'):
by = By.XPATH
else:
by = By.CSS_SELECTOR
self._wait_for(EC.text_to_be_present_in_element_value((by,
value), **kwargs)
def _find_next_page_element(self):
"""Finds the element that locates the next page for any search engine.
Returns:
The element that needs to be clicked to get to the next page or a boolean value to
indicate an error condition.
"""
if self.search_type == 'normal':
selector = self.next_page_selectors[self.search_engine_name]
try:
# wait until the next page link is clickable
webdriverwait(self.webdriver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))
except (WebDriverException, TimeoutException):
self._save_debug_screenshot()
# raise Exception('{}: Cannot locate next page element: {}'.format(self.name,str(e)))
try:
return self.webdriver.find_element_by_css_selector(selector)
except Exception:
logger.error('Failed find_element_by_css_selector,sleep 30 sec')
time.sleep(30)
pass
elif self.search_type == 'image':
self.page_down()
if self.search_engine_name == 'google':
return self.webdriver.find_element_by_css_selector('input._kvc')
else:
return True
def test_basic_inventory(self):
ui_test_banner()
driver = self.init_driver()
self.login(driver)
assert self.click_button(driver, "Devices")
authorized_device = self.wait_for_element(driver, By.CSS_SELECTOR, "div.rightFluid.padding-right tbody.clickable > tr")
assert authorized_device
authorized_device.click()
assert "vexpress-qemu" in authorized_device.text
assert "mender-image-master" in authorized_device.text
# make sure basic inventory items are there
assert self.wait_for_element(driver, By.XPATH, "//*[contains(text(),'Linux version')]")
assert self.wait_for_element(driver,'eth0')]")
assert self.wait_for_element(driver,'ARM')]")
ui_test_success()
self.destroy_driver(driver)
def test_deployment_in_progress(self):
ui_test_banner()
driver = self.init_driver()
self.login(driver)
assert self.click_button(driver, "Deployments")
timeout = time.time() + 60*5
while time.time() < timeout:
e = self.wait_for_element(driver, "span.status.inprogress")
if e.text == '1':
break
time.sleep(1)
else:
raise Exception("Deployment never in progress")
ui_test_success()
self.destroy_driver(driver)
def test_deployment_successful(self):
ui_test_banner()
driver = self.init_driver()
self.login(driver)
assert self.click_button(driver, "span.status.success")
if e.text == '1':
break
time.sleep(1)
else:
raise Exception("Deployment never completed")
ui_test_success()
self.destroy_driver(driver)
def view_volume(self, name):
row = self._get_row_with_volume_name(name)
name_link = row.cells['name'].find_element(by.By.CSS_SELECTOR, 'a')
name_link.click()
def deselect_by_value(self, value):
"""deselect all options that have a value matching the argument. That is,when given "foo" this
would deselect an option like:
<option value="foo">Bar</option>
:Args:
- value - The value to match against
throws NoSuchElementException If there is no option with specisied value in SELECT
"""
if not self.is_multiple:
raise NotImplementedError("You may only deselect options of a multi-select")
matched = False
css = "option[value = %s]" % self._escapestring(value)
opts = self._el.find_elements(By.CSS_SELECTOR, css)
for opt in opts:
self._unsetSelected(opt)
matched = True
if not matched:
raise NoSuchElementException("Could not locate element with value: %s" % value)
def test_profile_navigation(self, browser, base_test_data):
"""
nothing should break when navigating to the profile and back to learners search page
"""
create_enrolled_user_batch(2, program=base_test_data.program, is_staff=False)
browser.get("/learners")
browser.click_when_loaded(By.CLASS_NAME, 'menu-icon')
browser.wait().until(
lambda driver: "open" in driver.find_element_by_class_name('nav-drawer').get_attribute('class')
)
browser.click_when_loaded(By.CSS_SELECTOR, 'a .profile-image')
browser.wait_until_loaded(By.CLASS_NAME, 'user-page')
# Go back to learners
browser.click_when_loaded(By.CLASS_NAME, "a[href='/learners']")
browser.wait_until_loaded(By.CLASS_NAME, 'learner-results')
def select_by_value(self, value):
"""Select all options that have a value matching the argument. That is,when given "foo" this
would select an option like:
<option value="foo">Bar</option>
:Args:
- value - The value to match against
"""
css = "option[value =%s]" % self._escapestring(value)
opts = self._el.find_elements(By.CSS_SELECTOR, css)
matched = False
for opt in opts:
self._setSelected(opt)
if not self.is_multiple:
return
matched = True
if not matched:
raise NoSuchElementException("Cannot locate option with value: %s" % value)
def goto_course_list(self):
"""Go to the course picker."""
long_wait = webdriverwait(self.driver, 30)
try:
long_wait.until(
expect.presence_of_element_located(
(By.ID, 'ox-react-root-container')
)
)
if 'tutor' in self.current_url():
self.find(By.CSS_SELECTOR, '.ui-brand-logo').click()
self.page.wait_for_page_load()
else:
raise HTTPError('Not currently on an OpenStax Tutor webpage:' +
'%s' % self.current_url())
except Exception as ex:
raise ex
def execises_logout(self):
"""Exercises logout helper."""
wait = webdriverwait(self.driver, 3)
try:
wait.until(
expect.element_to_be_clickable(
(By.ID, 'navbar-dropdown')
)
).click()
wait.until(
expect.element_to_be_clickable(
(By.CSS_SELECTOR, '[type="submit"]')
)
).click()
self.page.wait_for_page_load()
except NoSuchElementException:
# Different page,but uses the same logic and link text
self.find(By.CSS_SELECTOR, '[data-method]').click()
def goto_calendar(self):
"""Return the teacher to the calendar dashboard."""
print('Enter: goto_calendar')
try:
print('Try to return to the calendar')
self.find(By.CSS_SELECTOR, '.course-name').click()
print('Succeeded')
self.page.wait_for_page_load()
except:
print('Failed,Try to return to the calendar using the Brand')
try:
self.find(
By.CSS_SELECTOR,
'.brand'
).click()
print('Succeeded')
self.page.wait_for_page_load()
except:
print('Failed,Load manually')
self.get(
'https://' +
'/'.join(self.driver.current_url.split('/')[2:5])
)
pass
print('Exit: goto_calendar')
def select_by_value(self,when given "foo" this
would select an option like:
<option value="foo">Bar</option>
:Args:
- value - The value to match against
throws NoSuchElementException If there is no option with specisied value in SELECT
"""
css = "option[value =%s]" % self._escapestring(value)
opts = self._el.find_elements(By.CSS_SELECTOR, css)
matched = False
for opt in opts:
self._setSelected(opt)
if not self.is_multiple:
return
matched = True
if not matched:
raise NoSuchElementException("Cannot locate option with value: %s" % value)
def _given_xpath_or_css(self, selector):
xpath = selector.pop('xpath', None)
css = selector.pop('css', None)
if not (xpath or css):
return None
if xpath and css:
raise ValueError("'xpath' and 'css' cannot be combined ({})".format(selector))
how, what = [None] * 2
if xpath:
how = By.XPATH
what = xpath
elif css:
how = By.CSS_SELECTOR
what = css
if selector and not self._can_be_combined_with_xpath_or_css(selector):
raise ValueError('{} cannot be combined with other selectors {})'.format(how, selector))
return [how, what]
def find_element(self, by=By.ID, value=None):
if not By.is_valid(by) or not isinstance(value, str):
raise InvalidSelectorException("Invalid locator values passed in")
if self._w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self._execute(Command.FIND_CHILD_ELEMENT,
{"using": by, "value": value})['value']
def find_elements(self, str):
raise InvalidSelectorException("Invalid locator values passed in")
if self._w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self._execute(Command.FIND_CHILD_ELEMENTS, "value": value})['value']
def find_element(self, value=None):
"""
'Private' method used by the find_element_by_* methods.
:Usage:
Use the corresponding find_element_by_* instead of this.
:rtype: WebElement
"""
if not By.is_valid(by) or not isinstance(value, str):
raise InvalidSelectorException("Invalid locator values passed in")
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self.execute(Command.FIND_ELEMENT,
{'using': by, 'value': value})['value']
def select_by_value(self, css)
matched = False
for opt in opts:
self._setSelected(opt)
if not self.is_multiple:
return
matched = True
if not matched:
raise NoSuchElementException("Cannot locate option with value: %s" % value)
def wait_for_visibility(
driver: webdriver, *, by_css: str = None,
by_id: str = None, time_to_wait: int = 5):
"""Wait until element is visible.
:param driver: Selenium driver
:param by_css: CSS selector to locate the element to wait for
:param by_id: ID of the element to wait for
:param time_to_wait: maximum number of seconds to wait
"""
assert by_id or by_css, "Provide ID or CSS selector"
if by_css:
by_locator = (By.CSS_SELECTOR, by_css)
else:
by_locator = (By.ID, by_id)
webdriverwait(driver, time_to_wait).until(
expected_conditions.visibility_of_element_located(by_locator))
def shot_campaign(live_server, organizer, event, logged_in_client, campaign_web, campaign_twitter, orders, clicks):
event.plugins += ',pretix_campaigns'
event.save()
logged_in_client.get(live_server.url + '/control/event/{}/{}/campaigns/'.format(
organizer.slug, event.slug
))
screenshot(logged_in_client, 'website/control/campaigns_list.png')
logged_in_client.get(live_server.url + '/control/event/{}/{}/campaigns/{}/'.format(
organizer.slug, event.slug, campaign_twitter.code
))
webdriverwait(logged_in_client, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#cbd_chart svg"))
)
time.sleep(.5)
screenshot(logged_in_client, 'website/control/campaigns_detail.png')
def shot_campaign(live_server, 'plugins/campaigns/list.png')
logged_in_client.get(live_server.url + '/control/event/{}/{}/campaigns/{}/edit'.format(
organizer.slug, campaign_twitter.code
))
screenshot(logged_in_client, 'plugins/campaigns/edit.png')
logged_in_client.get(live_server.url + '/control/event/{}/{}/campaigns/{}/'.format(
organizer.slug, 'plugins/campaigns/stats.png')
def _goto_next_page(self):
"""
Click the next page element,
Returns:
The url of the next page or False if there is no such url
(end of available pages for instance).
"""
next_url = ''
element = self._find_next_page_element()
if hasattr(element, 'click'):
next_url = element.get_attribute('href')
try:
element.click()
except WebDriverException:
# See http://stackoverflow.com/questions/11908249/debugging-element-is-not-clickable-at-point-error
# first move mouse to the next element,some times the element is not visibility
selector = self.next_page_selectors[self.search_engine_name]
if selector:
try:
next_element = webdriverwait(self.webdriver, 5).until(
EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
webdriver.ActionChains(self.webdriver).move_to_element(next_element).perform()
# wait until the next page link emerges
webdriverwait(self.webdriver, 8).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, selector)))
element = self.webdriver.find_element_by_css_selector(selector)
next_url = element.get_attribute('href')
element.click()
except WebDriverException:
pass
# wait until the next page was loaded
if not next_url:
return False
else:
return next_url
def choose_folder(self, folder_name):
folder = self.is_object_present(folder_name)
folder_link = folder.cells[0].find_element(By.CSS_SELECTOR, 'a')
folder_link.click()
self._wait_until(lambda _: self.objects_table.is_empty)
def detach(self, volume, instance):
detach_button = self.attachments_table.find_element(
By.CSS_SELECTOR, self._detach_template.format(volume, instance))
detach_button.click()
return forms.BaseFormRegion(self.driver, self.conf)
def wait_for(self, css_selector, timeout=10):
"""
Helper function that blocks until a CSS selector is found on the page.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
self.wait_until(
ec.presence_of_element_located((By.CSS_SELECTOR, css_selector)),
timeout
)
def wait_for_text(self, text, timeout=10):
"""
Helper function that blocks until the text is found in the CSS selector.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
self.wait_until(
ec.text_to_be_present_in_element(
(By.CSS_SELECTOR, css_selector), text),
timeout
)
def wait_for_value(self, timeout=10):
"""
Helper function that blocks until the value is found in the CSS selector.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
self.wait_until(
ec.text_to_be_present_in_element_value(
(By.CSS_SELECTOR,
timeout
)
def wait_until_visible(self, timeout=10):
"""
Block until the element described by the CSS selector is visible.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
self.wait_until(
ec.visibility_of_element_located((By.CSS_SELECTOR,
timeout
)
def wait_until_invisible(self, timeout=10):
"""
Block until the element described by the CSS selector is invisible.
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
self.wait_until(
ec.invisibility_of_element_located((By.CSS_SELECTOR,
timeout
)
def testWelcomeMessage(self):
self.assertTextPresent(By.CSS_SELECTOR, "h1", "Hello World");
def _change_focus(self, by, selector, focus = True, message = None):
description = self.describeElement(by, selector)
wait_for = self.getDefaultWaitFor()
change = 'focus' if focus else 'blur'
element = self.assertElementPresent(by, message, wait_for = wait_for)
self.log("{0} on {1}{2}".format(change, description, \
",because " + message if message else ""))
script = ""
if by == By.ID:
script = "jQuery(\"#{0}\")".format(selector)
elif by == By.CSS_SELECTOR:
script = "jQuery(\"{0}\")".format(selector)
else:
self.onFail(by, "Cannot {0} for this selector type (yet).".\
format(change))
script = "{0}.{1}();".format(script, change)
self.log("{0} on {1} using {2}".format(change, script))
self.driver.execute_script(script)
return element
def submitForm(self, buttonBy = None, buttonValue = None):
self.click(buttonBy if buttonBy else By.CSS_SELECTOR, buttonValue if buttonValue else \
"button.submitBtn", "Submit form")
def find_element_by_css_selector(self, css_selector):
"""Finds element within this element's children by CSS selector.
:Args:
- css_selector - CSS selctor string,ex: 'a.nav#home'
"""
return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
def find_elements_by_css_selector(self, css_selector):
"""Finds a list of elements within this element's children by CSS selector.
:Args:
- css_selector - CSS selctor string,ex: 'a.nav#home'
"""
return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
def find_elements(self, "value": value})['value']
def find_element_by_css_selector(self, css_selector):
"""
Finds an element by css selector.
:Args:
- css_selector: The css selector to use when finding elements.
:Usage:
driver.find_element_by_css_selector('#foo')
"""
return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
def find_elements_by_css_selector(self, css_selector):
"""
Finds elements by css selector.
:Args:
- css_selector: The css selector to use when finding elements.
:Usage:
driver.find_elements_by_css_selector('.foo')
"""
return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
def find_element(self, 'value': value})['value']
def find_elements(self, value=None):
"""
'Private' method used by the find_elements_by_* methods.
:Usage:
Use the corresponding find_elements_by_* instead of this.
:rtype: list of WebElement
"""
if not By.is_valid(by) or not isinstance(value, str):
raise InvalidSelectorException("Invalid locator values passed in")
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self.execute(Command.FIND_ELEMENTS, 'value': value})['value']